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

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) {}  
CodeMed
источник
«но не когда я вызываю его из 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"});
garethTheRed
источник
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, так что команда бесполезна.
Фреда