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) {}  
CodeMed
quelle
"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"});
garethTheRed
quelle
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.)

Evgeny Vereshchagin
quelle
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,