Pregunta ¿Hay alguna manera de hacer que journalctl muestre los registros de "la última vez que se ejecutó foo.service"?


Estoy particularmente interesado en esto para ver la salida de servicios oneshot que se ejecutan en un temporizador. los --unit La bandera está cerca, pero concatena todas las ejecuciones del servicio juntas. La forma más obvia que se me ocurre es filtrar por PID, pero eso me hace preocuparme por la reutilización / servicios de PID en esa bifurcación, y obtener el último PID es bastante inconveniente. ¿Hay algún otro identificador que corresponda a una sola ejecución de un servicio, que pueda usar para filtrar los registros?

EDITAR: Felizmente aceptaría un "no" autoritario si esa es la respuesta real.


8
2018-04-07 20:48


origen




Respuestas:


No estoy seguro de qué marca de tiempo tiene más sentido, pero esto funciona para mí. Esperemos que haya una mejor manera de trabajar con las marcas de tiempo de systemctl show awk - no pudo averiguar cómo controlar el formato de las marcas de tiempo.

unit=foo.service

ts=$(systemctl show -p ActiveEnterTimestamp $unit)

echo $ts
ActiveEnterTimestamp=Fri 2016-11-11 12:30:01 MST

journalctl -u $unit --since "$(echo $ts | awk '{print $2 $3}')"

10
2017-11-11 19:49





Puede usar el indicador de inicio para obtener solo los registros de ese inicio. por ejemplo

journalctl _SYSTEMD_UNIT=avahi-daemon.service -b 5

4
2018-04-11 19:33



Esto es similar a lo que quiero, pero no funciona en situaciones como: 1) si la máquina se ha reiniciado desde la última vez que se ejecutó el servicio, o 2) si el servicio se ha ejecutado varias veces desde el último arranque. - Jack O'Connor
No estoy seguro de por qué no funciona para el primer caso. Si se ha reiniciado, también se reiniciará. Solo tienes que ir a ese arranque específico y buscar tu información. En cuanto al segundo ... tienes razón. Los registros de ruido dependen de la cantidad de veces que se haya reiniciado el servicio. Pero una vez que haya visto su servicio pid, puede filtrarlo utilizando el argumento _PID = XXX. Las posibilidades de reutilizar el mismo pid para el mismo servicio en el mismo ciclo de arranque son ... ni idea ... pero casi imposibles. - Nikolaidis Fotis
Me interesa el manejo de servicios que no necesariamente se ejecutan en el arranque, ya sea porque están en temporizadores o porque son comandos únicos. - Jack O'Connor


Estos podrían ayudarte:

  • journalctl -u foo.service | cola -n 2


2
2018-04-12 09:46



Esto se siente como una solución alternativa al enfoque PID, pero es muy manual. Si mi servicio se ejecuta durante muchos segundos y escupe muchas líneas de registro, tengo que buscar la primera línea que tenga la marca de tiempo inicial que me interesa. Eso no funcionará muy bien en un guión. - Jack O'Connor


Puedes usar filtros de campo con Journalctl. P.ej.

journalctl _PID=1234

Obtenga una lista de todos los campos disponibles usando:

journalctl --fields --unit kubelet

Un campo disponible es _PID.

Puede obtener el PID de un proceso en ejecución usando pidof o systemctl show --property MainPID <SERVICE_NAME>

Así es como obtengo los registros del proceso actual de Kubernetes Kubelet:

# journalctl --unit kubelet _PID=$(systemctl show --property MainPID kubelet 2>/dev/null | cut -d= -f2) | head

Ahora dime por qué Kubernetes es tan difícil de instalar :-(


2
2017-12-14 17:17





journalctl -r | grep -m1 foo.service


0
2017-08-21 21:52



Bienvenido a ServerFault. ¿Puede explicar cómo esto es mejor o diferente a las otras respuestas que ya estaban aquí? serverfault.com/help/how-to-answer - chicks