liste des unités sélectionnables pour journalctl

18

Dans un serveur CentOS 7, je veux obtenir la liste des unités sélectionnables pour lesquelles journalctlpeuvent produire des journaux. Comment puis-je changer le code suivant pour y parvenir?

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

Dans le terminal CentOS 7, le code ci-dessus se produit grep: UNIT: No such file or directory.

ÉDITER:

Le programme java suivant se termine sans imprimer aucune sortie du grep souhaité. Comment puis-je changer les choses pour que le programme java fonctionne en plus de la version du 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
la source
"mais pas quand je l'appelle depuis un programme java" et le programme Java?
Braiam
Il y a une faute de frappe là-dedans, ça devrait êtregrep -F
Anthon
@don_crissti Comme vous le souhaitez.
CodeMed

Réponses:

24

journalctl peut afficher des journaux pour toutes les unités - si ces unités écrivent dans le journal, c'est différent.

Pour répertorier toutes les unités disponibles et donc toutes disponibles pour journalctlutilisation:

systemctl list-unit-files --all

En ce qui concerne votre code java, afin de faire fonctionner les tuyaux, Runtime.exec()vous pouvez soit placer la commande dans un script et appeler le script, soit utiliser un tableau de chaînes, quelque chose comme:

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

ou:

Runtime.getRuntime().exec(new String[]{"sh", "-c", "command1 | command2 | command3"});
garethTheRed
la source
list-unit-filesn'affiche pas les unités instanciées et les unités transitoires.
Evgeny Vereshchagin
10

man journalctl dit:

-F, --field = Imprimer toutes les valeurs de données possibles que le champ spécifié peut prendre dans toutes les entrées du journal.

Vous pouvez donc exécuter:

journalctl --field _SYSTEMD_UNIT

pour obtenir la liste des unités sélectionnables pour lesquelles journalctlpeuvent produire des journaux

(par défaut, seul root et les utilisateurs qui sont membres de quelques groupes spéciaux sont autorisés à accéder à la revue du système et les journaux d'autres utilisateurs. Les membres des groupes systemd-journal, admet wheelpeut lire tous les fichiers de journal.)

Evgeny Vereshchagin
la source
Vous devez être un superutilisateur pour exécuter cette commande. Alors fais-le sudo journalctl --field _SYSTEMD_UNIT. Mais sinon merci et +1 pour avoir ajouté des informations.
CodeMed
En fait, si vous ne le faites pas, sudovous pouvez l'utiliser, journalctlmais vous n'obtenez qu'une petite liste d'unités directement liées à la session de votre utilisateur.
dragon788
Cela devrait être la réponse acceptée car systemd 219elle ne supporte pas les arguments list-unit-files --allfournis dans la réponse actuellement acceptée.
Petrus K.
list-unit-files montre juste les fichiers d'unité. Vous pouvez obtenir une liste similaire en tapant simplement "systemctl" sans arguments. La plupart d'entre eux ne prennent pas en charge journald, de sorte que la commande n'est d'aucune utilité.
Fred