lista de unidades selecionáveis ​​para journalctl

18

Em um servidor CentOS 7, desejo obter a lista de unidades selecionáveis ​​para as quais journalctlpodem produzir logs. Como posso alterar o código a seguir para fazer isso?

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

No terminal CentOS 7, o código acima é produzido grep: UNIT: No such file or directory.

EDITAR:

O programa java a seguir está sendo finalizado sem imprimir nenhuma saída do grep desejado. Como posso mudar as coisas para que o programa java funcione além da versão do 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
fonte
"mas não quando eu chamo isso do programa a java" e do programa Java?
Braiam 28/11
Há um erro de digitação nisso, deve sergrep -F
Anthon 28/11
@don_crissti Como desejar.
CodeMed 26/10/2015

Respostas:

24

journalctl pode exibir logs para todas as unidades - se essas unidades gravam no log é uma questão diferente.

Para listar todas as unidades disponíveis e, portanto, todas disponíveis para journalctluso:

systemctl list-unit-files --all

Quanto ao seu código java, para fazer com que os pipes funcionem, Runtime.exec()você pode colocar o comando em um script e invocar o script ou usar uma matriz de strings, algo como:

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

ou:

Runtime.getRuntime().exec(new String[]{"sh", "-c", "command1 | command2 | command3"});
garethTheRed
fonte
list-unit-filesnão mostra unidades instanciadas e unidades transitórias.
Evgeny Vereshchagin
10

man journalctl diz:

-F, --field = Imprime todos os valores de dados possíveis que o campo especificado pode receber em todas as entradas do diário.

Então, você pode executar:

journalctl --field _SYSTEMD_UNIT

para obter a lista de unidades selecionáveis ​​para as quais journalctlpodem produzir logs

(por padrão, somente o root e os usuários que são membros de alguns grupos especiais têm acesso ao diário do sistema e os diários de outros usuários. Os membros dos grupos systemd-journal, adme wheelpode ler todos os arquivos de diário.)

Evgeny Vereshchagin
fonte
Você deve ser um superusuário para executar esse comando. Assim torná-lo sudo journalctl --field _SYSTEMD_UNIT. Caso contrário, agradeço e +1 por adicionar informações.
CodeMed 30/10/2015
Na verdade, se não, sudovocê pode usar, journalctlmas você só recebe uma pequena lista de unidades diretamente relacionadas à sessão do usuário.
precisa saber é o seguinte
Essa deve ser a resposta aceita, pois systemd 219não suporta os argumentos list-unit-files --allfornecidos na resposta atualmente aceita.
Petrus K.
list-unit-files apenas mostra os arquivos da unidade. Você pode obter uma lista semelhante apenas digitando "systemctl" sem argumentos. A maioria deles não suporta journald, de modo que o comando é inútil.
fred