список выбираемых единиц для журнала


18

На сервере CentOS 7 я хочу получить список выбираемых модулей, для которых journalctlможно создавать журналы. Как я могу изменить следующий код для достижения этой цели?

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

В терминале CentOS 7, приведенный выше код производит grep: UNIT: No such file or directory.

РЕДАКТИРОВАТЬ:

Следующая Java-программа завершается без вывода какого-либо вывода из требуемого grep. Как я могу изменить вещи, чтобы Java-программа работала в дополнение к терминальной версии?

    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-программы» и Java-программы?
Брайам

В этом есть опечатка, это должно бытьgrep -F
Anthon

@don_crissti Как вы хотите.
CodeMed

Ответы:


24

journalctl может отображать журналы для всех блоков - вопрос о том, записывают ли эти блоки в журнал другой вопрос.

Чтобы перечислить все доступные единицы и, следовательно, все доступные для journalctlиспользования:

systemctl list-unit-files --all

Что касается вашего Java-кода, для того, чтобы заставить работать каналы, 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не показывает инстанцированные единицы и переходные единицы.
Евгений Верещагин

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представленные в принятом в настоящее время ответе.
Петрус К.

list-unit-files просто показывает файлы модулей. Вы можете получить похожий список, просто набрав "systemctl" без аргументов. Большинство из них не поддерживают journald, так что команда бесполезна.
Фреда
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.