Tengo un servicio (escrito por mí mismo) que se ejecuta en un servidor Debian (Jessie), y los registros del servicio indican que se reinició en un momento determinado. No hay indicios de un fallo de seguridad u otro bloqueo, por lo que ahora estoy tratando de averiguar si la aplicación falló de alguna manera silenciosa y fue reaparecida por systemd, o si un usuario reinició el servicio a propósito systemctl
.
El historial de shell no muestra dicha actividad, pero eso no es concluyente debido a export HISTCONTROL=ignoreboth
que una sesión SSH podría haberse agotado, evitando que el historial de bash de un inicio de sesión anterior se escriba en el disco. El servidor no se reinició en ese momento.
Pero esperaría que systemd mismo mantenga un registro que indique cuándo se reinició un servicio a propósito . Para mi sorpresa, no pude encontrar ninguna documentación (por ejemplo, para journalctl
) sobre cómo obtener dichos registros.
Algunas otras publicaciones (por ejemplo, ¿Dónde está / por qué no hay registro para los servicios normales de systemd de usuario? ) Parecen indicar que debería haber mensajes de registro como este:
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Starting chatty.service...
Jan 15 19:28:08 qbd-x230-suse.site systemd[1]: Started chatty.service.
Pero no veo tales mensajes de registro en mi sistema.
¿Hay alguna manera de saber cuándo se iniciaron, detuvieron o reiniciaron los servicios systemd?
Editar : Parece que el problema típico con el que las personas pueden encontrarse es que se ejecutan journalctl
como usuarios sin privilegios. Este no es el caso para mí, he estado operando root
todo el tiempo. En respuesta a un comentario, correr grep systemd /var/log/syslog
solo me da esto:
Jun 6 09:28:35 server systemd[22057]: Starting Paths.
Jun 6 09:28:35 server systemd[22057]: Reached target Paths.
Jun 6 09:28:35 server systemd[22057]: Starting Timers.
Jun 6 09:28:35 server systemd[22057]: Reached target Timers.
Jun 6 09:28:35 server systemd[22057]: Starting Sockets.
Jun 6 09:28:35 server systemd[22057]: Reached target Sockets.
Jun 6 09:28:35 server systemd[22057]: Starting Basic System.
Jun 6 09:28:35 server systemd[22057]: Reached target Basic System.
Jun 6 09:28:35 server systemd[22057]: Starting Default.
Jun 6 09:28:35 server systemd[22057]: Reached target Default.
Jun 6 09:28:35 server systemd[22057]: Startup finished in 59ms.
Jun 6 09:37:08 server systemd[1]: Reexecuting.
fuente
grep systemd /var/log/syslog
Stopped target Default
,Starting Shutdown
etc. Nada que indique algo sobre servicios individuales. ¿Quizás es solo un problema de configuración? Tenga en cuenta que estoy en Debian Jessie en este caso particular./etc/systemd/journald.conf
no se ha anuladoMaxLevelStore
oMaxLevelSyslog
, y busque en todos los otros lugares donde puede configurar journald como se enumera enman journald.conf
./etc/systemd
están esencialmente vacíos (todas las opciones comentadas, incluidas las que mencionó).Respuestas:
Si necesita hacer un script para esto, debe considerar el uso del
systemctl show
comando. Es más útil para los scripts que intentar analizar cualquier cosastatus
. Por ejemplo, para saber cuándo se inició el servicio por última vez, puede usar:Si desea ver todas las propiedades disponibles, simplemente omita la bandera y las eliminará todas.
La documentación de estas propiedades se puede encontrar aquí .
fuente
StatusErrno
yResult
? Me pregunto si esos cambian si el servicio falla o se reinicia. Si realmente necesita ir más allá, intente agregar unExecStopPost
paso donde toque un archivo y actualice una marca de tiempo al apagar. Eso lo ayudará a diferenciar entre los reinicios silenciosos y los resueltos.Con la configuración predeterminada en Debian, un usuario sin privilegios no tendrá acceso a los registros systemd-journald ni syslog. Si inició sesión como usuario normal, recibirá esta respuesta de journalctl:
lo cual es un poco confuso.
Si ha iniciado sesión como root,
journalctl --unit=yourservice
debería darle la información que está buscando. Después de unsystemctl restart bind9
en mi servidor, obtengo esto después dejournalctl --unit=bind9
:Si mato a bind9 explícitamente con
kill -9
,journalctl --unit=bind9
da:La primera línea indica que el proceso murió porque fue asesinado.
systemd-journald también reenvía todos los mensajes de registro a syslog, por lo que también debe encontrar estos mensajes en
/var/log/syslog
.Systemd y systemd-journald tienen una configuración predeterminada compilada que se puede cambiar en
/etc/systemd/system.conf
y/etc/systemd/journald.conf
.Puede ser útil saber que, por defecto, systemd-journald almacena los registros
/run
, lo cual estmpfs
, y por lo tanto desaparece después de un reinicio. Esto significa que para obtener mensajes de registro más antiguos que el último arranque, tendrá que mirar los archivos syslog. En este caso, journalctl no le dará registros más antiguos que el último arranque. Esto se puede cambiar/etc/systemd/journald.conf
configurandoStorage=persistent
.Las páginas del manual que documentan esto son:
También tenga en cuenta que para que un servicio sea reiniciado automáticamente por systemd, esto debe configurarse en su
.service
archivo. Deman 5 systemd.service
:fuente
systemd
salida del diario como usted describió, a pesar de que he trabajado como root todo el tiempo./var/log/syslog
tampoco muestra nada. Esto es systemd 215 por cierto.Puede ver la última vez que su servicio se inició o reinició. Use
service chatty status
osystemctl status chatty
. Aquí hay ejemplos para el servicio apache2 o httpd:la línea
Active: active (running) since Wen. 2017-06-02 15:53:01 CEST; 21min ago
muestra cómo se está ejecutando el servicio, pero no sé si puede mostrar como una "lista" exactamente lo que está buscando.fuente
service
es un antiguo comando Upstart que funciona con systemd para compatibilidad. Elsystemd
comando nativo essystemctl status apache2
.Podemos usar la
-f
opción para filtrar mensajes de la revista ( https://www.freedesktop.org/software/systemd/man/systemd.journal-fields.html ).fuente