lista de unidades seleccionables para journalctl

18

En un servidor CentOS 7, quiero obtener la lista de unidades seleccionables para las que journalctlpueden producir registros. ¿Cómo puedo cambiar el siguiente código para lograr esto?

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

En el terminal CentOS 7, produce el código anterior grep: UNIT: No such file or directory.

EDITAR:

El siguiente programa Java está finalizando sin imprimir ningún resultado del grep deseado. ¿Cómo puedo cambiar las cosas para que el programa Java funcione además de la versión del 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
fuente
"pero no cuando lo llamo desde un programa java" y el programa Java?
Braiam
Hay un error tipográfico en eso, debería sergrep -F
Anthon
@don_crissti Como quieras.
CodeMed

Respuestas:

24

journalctl puede mostrar registros para todas las unidades: si estas unidades escriben en el registro es una cuestión diferente.

Para enumerar todas las unidades disponibles y, por lo tanto, todas disponibles para journalctlusar:

systemctl list-unit-files --all

En cuanto a su código Java, para que las tuberías funcionen Runtime.exec(), puede poner el comando en un script e invocar el script o usar una matriz de cadenas, algo como:

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

o:

Runtime.getRuntime().exec(new String[]{"sh", "-c", "command1 | command2 | command3"});
garethTheRed
fuente
list-unit-filesno muestra unidades instanciadas y unidades transitorias.
Evgeny Vereshchagin
10

man journalctl dice:

-F, --field = Imprime todos los valores de datos posibles que el campo especificado puede tomar en todas las entradas del diario.

Entonces, puedes ejecutar:

journalctl --field _SYSTEMD_UNIT

para obtener la lista de unidades seleccionables para las que journalctlpueden producir registros

(por defecto, sólo root y los usuarios que son miembros de algunos grupos especiales tienen acceso a la revista sistema y los diarios de otros usuarios. Los miembros de los grupos systemd-journal, admy wheelpuede leer todos los archivos de diario.)

Evgeny Vereshchagin
fuente
Debes ser un superusuario para ejecutar ese comando. Así que hazlo sudo journalctl --field _SYSTEMD_UNIT. Pero por lo demás, gracias y +1 por agregar información.
CodeMed
En realidad, si no sudopuede, puede usar, journalctlpero solo obtiene una pequeña lista de unidades que están directamente relacionadas con la sesión de su usuario.
dragon788
Esta debería ser la respuesta aceptada, ya systemd 219que no admite los argumentos list-unit-files --allproporcionados en la respuesta actualmente aceptada.
Petrus K.
list-unit-files solo muestra los archivos de la unidad. Puede obtener una lista similar simplemente escribiendo "systemctl" sin argumentos. La mayoría de ellos no son compatibles con journald, por lo que ese comando no sirve.
Fred