Liste der auswählbaren Einheiten für journalctl


18

In einem CentOS 7-Server möchte ich die Liste der auswählbaren Einheiten abrufen, für die journalctlProtokolle erstellt werden können. Wie kann ich den folgenden Code ändern, um dies zu erreichen?

journalctl --output=json-pretty | grep -f UNIT | sort -u  

Im CentOS 7-Terminal wird der obige Code erzeugt grep: UNIT: No such file or directory.

BEARBEITEN:

Das folgende Java-Programm wird beendet, ohne dass eine Ausgabe des gewünschten grep gedruckt wird. Wie kann ich die Dinge so ändern, dass das Java-Programm zusätzlich zur Terminal-Version funktioniert?

    String s;
    Process p;
    String[] cmd = {"journalctl --output=json-pretty ","grep UNIT ","sort -u"};
    try {
        p = Runtime.getRuntime().exec(cmd);
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        System.out.println ("exit: " + p.exitValue()+", "+p.getErrorStream());
        BufferedReader br2 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        while ((s = br2.readLine()) != null)
            System.out.println("error line: " + s);
        p.waitFor();
        p.destroy();
    } catch (Exception e) {}  

"aber nicht, wenn ich es von einem Java-Programm aus aufrufe" und das Java-Programm?
Braiam

Es gibt einen Tippfehler, es sollte seingrep -F
Anthon

@don_crissti Wie du willst.
CodeMed

Antworten:


24

journalctl kann Protokolle für alle Einheiten anzeigen - ob diese Einheiten in das Protokoll schreiben, ist eine andere Sache.

So listen Sie alle verfügbaren Einheiten und damit alle journalctlzur Verwendung verfügbaren Einheiten auf:

systemctl list-unit-files --all

In Bezug auf Ihren Java-Code können Sie, um Pipes zum Laufen zu bringen, Runtime.exec()entweder den Befehl in ein Skript einfügen und das Skript aufrufen oder ein String-Array verwenden, etwa:

String[] cmd = {"sh", "-c", "command1 | command2 | command3"};
p = Runtime.getRuntime().exec(cmd);

oder:

Runtime.getRuntime().exec(new String[]{"sh", "-c", "command1 | command2 | command3"});

list-unit-filesZeigt keine instanziierten Einheiten und transienten Einheiten an.
Evgeny Vereshchagin

10

man journalctl sagt:

-F, --field = Gibt alle möglichen Datenwerte aus, die das angegebene Feld in alle Einträge des Journals aufnehmen kann.

So können Sie laufen:

journalctl --field _SYSTEMD_UNIT

um die Liste der auswählbaren Einheiten abzurufen, für die journalctlProtokolle erstellt werden können

(standardmäßig nur root und Benutzer , die Mitglieder von einigen speziellen Gruppen sind der Zugriff auf das System gewährt Journal und die Zeitschriften anderer Nutzer. Die Mitglieder der Gruppen systemd-journal, admund wheelkönnen alle Journaldateien lesen.)


Sie müssen ein Superuser sein, um diesen Befehl ausführen zu können. Also mach es sudo journalctl --field _SYSTEMD_UNIT. Aber ansonsten danke und +1 für das Hinzufügen von Einsicht.
CodeMed

Eigentlich , wenn Sie nicht sudokönnen Sie verwenden , journalctlaber Sie haben nur eine kleine Liste von Einheiten erhalten , die in direktem Zusammenhang zu Sitzung Ihrer Benutzer.
Dragon788

Dies sollte die akzeptierte Antwort sein, da die in der aktuell akzeptierten Antwort angegebenen systemd 219Argumente nicht unterstützt werden list-unit-files --all.
Petrus K.

list-unit-files zeigt nur die Unit-Dateien an. Sie können eine ähnliche Liste erhalten, indem Sie einfach "systemctl" ohne Argumente eingeben. Die meisten von ihnen unterstützen Journald nicht, sodass der Befehl keinen Nutzen hat.
Freitag,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.