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

"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"});

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.)


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.