danh sách các đơn vị có thể lựa chọn cho tạp chí


18

Trong máy chủ CentOS 7, tôi muốn lấy danh sách các đơn vị có thể chọn để journalctlcó thể tạo nhật ký. Làm thế nào tôi có thể thay đổi mã sau đây để thực hiện điều này?

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

Trong thiết bị đầu cuối CentOS 7, đoạn mã trên tạo ra grep: UNIT: No such file or directory.

BIÊN TẬP:

Chương trình java sau đây đang kết thúc mà không in bất kỳ đầu ra nào từ grep mong muốn. Làm cách nào để thay đổi mọi thứ để chương trình java hoạt động cùng với phiên bản đầu cuối?

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

"Nhưng không phải khi tôi gọi nó từ chương trình java" và chương trình Java?
Braiam

Có một lỗi đánh máy trong đó, nó phải làgrep -F
Anthon

@don_crissti Như bạn muốn.
CodeMed

Câu trả lời:


24

journalctl có thể hiển thị nhật ký cho tất cả các đơn vị - cho dù các đơn vị này ghi vào nhật ký là một vấn đề khác.

Để liệt kê tất cả các đơn vị có sẵn và do đó tất cả có sẵn journalctlđể sử dụng:

systemctl list-unit-files --all

Đối với mã java của bạn, để làm cho các đường ống hoạt động với Runtime.exec()bạn, bạn có thể đặt lệnh trong một tập lệnh và gọi tập lệnh hoặc sử dụng một chuỗi chuỗi, đại loại như:

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

hoặc là:

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

list-unit-fileskhông hiển thị các đơn vị khởi tạo và các đơn vị tạm thời.
Evgeny Vereshchagin

10

man journalctl nói:

-F, --field = In tất cả các giá trị dữ liệu có thể mà trường được chỉ định có thể nhận trong tất cả các mục của tạp chí.

Vì vậy, bạn có thể chạy:

journalctl --field _SYSTEMD_UNIT

để có được danh sách các đơn vị có thể lựa chọn để journalctlcó thể tạo ra các bản ghi

(theo mặc định, chỉ có root và người dùng là thành viên của một vài nhóm đặc biệt được cấp quyền truy cập vào các tạp chí hệ thống và các tạp chí của những người dùng khác. Các thành viên của nhóm systemd-journal, admwheelcó thể đọc tất cả các file tạp chí.)


Bạn phải là một siêu người dùng để chạy lệnh đó. Vì vậy, làm cho nó sudo journalctl --field _SYSTEMD_UNIT. Nhưng nếu không, cảm ơn bạn và +1 để thêm cái nhìn sâu sắc.
CodeMed

Trên thực tế nếu bạn không sudothể sử dụng journalctlnhưng bạn chỉ nhận được một danh sách nhỏ các đơn vị có liên quan trực tiếp đến phiên người dùng của bạn.
dragon788

Đây phải là câu trả lời được chấp nhận vì systemd 219không hỗ trợ các đối số list-unit-files --allđược cung cấp trong câu trả lời hiện được chấp nhận.
Petrus K.

list-unit-files chỉ hiển thị các tập tin đơn vị. Bạn có thể nhận được một danh sách tương tự bằng cách chỉ cần gõ "systemctl" mà không có đối số. Hầu hết trong số họ không hỗ trợ journald vì vậy lệnh đó không có tác dụng.
fred
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.