daftar unit yang dipilih untuk jurnalctl

18

Di server CentOS 7, saya ingin mendapatkan daftar unit yang journalctldapat dipilih yang dapat menghasilkan log. Bagaimana saya bisa mengubah kode berikut untuk mencapai ini?

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

Di terminal CentOS 7, kode di atas menghasilkan grep: UNIT: No such file or directory.

EDIT:

Program java berikut berakhir tanpa mencetak keluaran apa pun dari grep yang diinginkan. Bagaimana saya bisa mengubah banyak hal sehingga program java bekerja di samping versi terminal?

    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
sumber
"tetapi tidak ketika saya menyebutnya dari program java" dan program Java?
Braiam
Ada kesalahan ketik dalam hal itu, seharusnyagrep -F
Anthon
@don_crissti Terserah Anda.
CodeMed

Jawaban:

24

journalctl dapat menampilkan log untuk semua unit - apakah unit ini menulis ke log adalah masalah yang berbeda.

Untuk membuat daftar semua unit yang tersedia dan karenanya semua tersedia untuk journalctldigunakan:

systemctl list-unit-files --all

Untuk kode java Anda, untuk membuat pipa berfungsi dengan baik Runtime.exec()Anda bisa memasukkan perintah dalam skrip dan memanggil skrip atau menggunakan array string, seperti:

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

atau:

Runtime.getRuntime().exec(new String[]{"sh", "-c", "command1 | command2 | command3"});
garethTheRed
sumber
list-unit-filestidak menunjukkan unit instantiated dan transient unit.
Evgeny Vereshchagin
10

man journalctl mengatakan:

-F, --field = Cetak semua nilai data yang mungkin yang dapat diambil oleh bidang yang ditentukan di semua entri jurnal.

Jadi, Anda dapat menjalankan:

journalctl --field _SYSTEMD_UNIT

untuk mendapatkan daftar unit yang journalctldapat dipilih yang dapat menghasilkan log

(secara default, hanya root dan pengguna yang merupakan anggota dari kelompok-kelompok khusus beberapa diberikan akses ke jurnal sistem dan jurnal dari pengguna lain. Anggota kelompok systemd-journal, admdan wheeldapat membaca semua file jurnal.)

Evgeny Vereshchagin
sumber
Anda harus menjadi pengguna super untuk menjalankan perintah itu. Jadi, buatlah sudo journalctl --field _SYSTEMD_UNIT. Tetapi sebaliknya terima kasih dan +1 untuk menambahkan wawasan.
CodeMed
Sebenarnya jika tidak, sudoAnda dapat menggunakan journalctltetapi Anda hanya mendapatkan daftar kecil unit yang terkait langsung dengan sesi pengguna Anda.
dragon788
Ini harus menjadi jawaban diterima sebagai systemd 219tidak mendukung argumen list-unit-files --allyang disediakan dalam jawaban yang diterima saat ini.
Petrus K.
daftar-unit-file hanya memperlihatkan file unit. Anda bisa mendapatkan daftar serupa dengan mengetik "systemctl" tanpa argumen. Sebagian besar dari mereka tidak mendukung journald sehingga perintah itu tidak ada gunanya.
fred