lista jednostek do wyboru dla Journalctl

18

Na serwerze CentOS 7 chcę uzyskać listę jednostek do wyboru, dla których journalctlmożna tworzyć dzienniki. Jak mogę zmienić następujący kod, aby to osiągnąć?

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

W terminalu CentOS 7 powstaje powyższy kod grep: UNIT: No such file or directory.

EDYTOWAĆ:

Następujący program Java kończy działanie bez drukowania danych wyjściowych z żądanego grep. Jak mogę zmienić rzeczy, aby program Java działał oprócz wersji terminalowej?

    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
źródło
„ale nie, kiedy dzwonię z programu Java” i programu Java?
Braiam
Jest w tym literówka, powinna byćgrep -F
Anthon
@don_crissti Jak sobie życzysz.
CodeMed,

Odpowiedzi:

24

journalctl może wyświetlać logi dla wszystkich jednostek - czy te jednostki zapisują do dziennika to inna sprawa.

Aby wyświetlić listę wszystkich dostępnych jednostek, a zatem wszystkich dostępnych journalctldo użycia:

systemctl list-unit-files --all

Jeśli chodzi o kod Java, w celu umożliwienia współpracy potoków Runtime.exec()możesz albo umieścić polecenie w skrypcie i wywołać skrypt, albo użyć tablicy ciągów, na przykład:

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

lub:

Runtime.getRuntime().exec(new String[]{"sh", "-c", "command1 | command2 | command3"});
garethTheRed
źródło
list-unit-filesnie pokazuje jednostek utworzonych i jednostek przejściowych.
Evgeny Vereshchagin
10

man journalctl mówi:

-F, --field = Wydrukuj wszystkie możliwe wartości danych, które określone pole może przyjąć we wszystkich pozycjach dziennika.

Możesz więc uruchomić:

journalctl --field _SYSTEMD_UNIT

aby uzyskać listę jednostek do wyboru, dla których journalctlmożna tworzyć dzienniki

(domyślnie tylko root i użytkowników, którzy są członkami kilku grup specjalnych mają dostęp do dziennika systemu i dzienniki innych użytkowników. Członkowie grupy systemd-journal, admi wheelmoże odczytywać wszystkie pliki dziennika).

Evgeny Vereshchagin
źródło
Musisz być superużytkownikiem, aby uruchomić to polecenie. Więc zrób to sudo journalctl --field _SYSTEMD_UNIT. Ale poza tym dziękuję i +1 za dodanie wglądu.
CodeMed
Właściwie, jeśli nie sudomożesz użyć, journalctlale dostajesz tylko niewielką listę jednostek, które są bezpośrednio związane z sesją użytkownika.
dragon788
To powinna być zaakceptowana odpowiedź, ponieważ systemd 219nie obsługuje argumentów list-unit-files --allpodanych w obecnie akceptowanej odpowiedzi.
Petrus K.,
lista-jednostek-plików pokazuje tylko pliki jednostek. Możesz uzyskać podobną listę, wpisując po prostu „systemctl” bez żadnych argumentów. Większość z nich nie obsługuje dzienników, więc polecenie nie ma sensu.
Fred