รายการของหน่วยที่เลือกได้สำหรับ journalctl


18

ในเซิร์ฟเวอร์ CentOS 7 ฉันต้องการรับรายการหน่วยที่สามารถเลือกได้ซึ่งjournalctlสามารถสร้างบันทึกได้ ฉันจะเปลี่ยนรหัสต่อไปนี้เพื่อทำสิ่งนี้ได้อย่างไร

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

ในเทอร์มินัล CentOS 7 โค้ดด้านบนจะสร้างgrep: UNIT: No such file or directoryขึ้น

แก้ไข:

โปรแกรม Java ต่อไปนี้ถูกยกเลิกโดยไม่ต้องพิมพ์ผลลัพธ์ใด ๆ จาก grep ที่ต้องการ ฉันจะเปลี่ยนสิ่งต่าง ๆ เพื่อให้โปรแกรมจาวาทำงานได้นอกเหนือจากรุ่นเทอร์มินัลได้อย่างไร

    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) {}  

"แต่ไม่ใช่เมื่อฉันเรียกมันจากโปรแกรมจาวา" และโปรแกรม Java เหรอ?
Braiam

มีการพิมพ์ผิดที่ควรจะเป็นgrep -F
Anthon

@don_crissti ตามที่คุณต้องการ
CodeMed

คำตอบ:


24

journalctl สามารถแสดงบันทึกสำหรับหน่วยทั้งหมด - ไม่ว่าหน่วยเหล่านี้เขียนลงในบันทึกเป็นเรื่องที่แตกต่างกัน

ในการแสดงรายการหน่วยทั้งหมดที่มีอยู่และดังนั้นจึงพร้อมjournalctlใช้งาน:

systemctl list-unit-files --all

สำหรับโค้ดจาวาของคุณเพื่อให้ไพพ์ทำงานกับRuntime.exec()คุณคุณสามารถใส่คำสั่งในสคริปต์และเรียกใช้สคริปต์หรือใช้สตริงอาร์เรย์ได้ดังนี้:

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

หรือ:

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

list-unit-filesไม่แสดงหน่วยอินสแตนซ์และหน่วยชั่วคราว
Evgeny Vereshchagin

10

man journalctl พูดว่า:

-F, --field = พิมพ์ค่าข้อมูลที่เป็นไปได้ทั้งหมดที่ระบุฟิลด์สามารถใช้ในรายการทั้งหมดของวารสาร

ดังนั้นคุณสามารถเรียกใช้:

journalctl --field _SYSTEMD_UNIT

เพื่อรับรายการของหน่วยที่เลือกได้ซึ่งjournalctlสามารถสร้างบันทึกได้

(โดยค่าเริ่มต้นรากและผู้ใช้ที่เป็นสมาชิกของกลุ่มพิเศษเพียงไม่กี่จะได้รับการเข้าถึงวารสารระบบและวารสารของผู้อื่น. สมาชิกของกลุ่มsystemd-journal, admและwheelสามารถอ่านไฟล์บันทึกทั้งหมด.)


คุณต้องเป็นผู้ใช้ขั้นสูงเพื่อเรียกใช้คำสั่งนั้น sudo journalctl --field _SYSTEMD_UNITเพื่อให้มัน แต่อย่างอื่นขอบคุณและ +1 สำหรับการเพิ่มความเข้าใจ
CodeMed

จริง ๆ แล้วถ้าคุณไม่sudoสามารถใช้งานได้journalctlแต่คุณจะได้รับรายชื่อหน่วยเล็ก ๆ ที่เกี่ยวข้องกับเซสชันของผู้ใช้โดยตรง
dragon788

นี่ควรเป็นคำตอบที่ยอมรับได้เนื่องจากsystemd 219ไม่รองรับอาร์กิวเมนต์ที่list-unit-files --allให้ไว้ในคำตอบที่ยอมรับในปัจจุบัน
Petrus K.

list-unit-files เพิ่งแสดงไฟล์ยูนิต คุณสามารถรับรายการที่คล้ายกันได้โดยพิมพ์ "systemctl" โดยไม่มีข้อโต้แย้ง ส่วนใหญ่ไม่สนับสนุน journald เพื่อให้คำสั่งนั้นไม่มีประโยชน์
เฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.