
Tengo un script que tiene un bucle "mientras es verdadero". Y quiero ejecutar ese script desde cron cada minuto, de modo que cuando el proceso finalice (o falle, sin importar el motivo), cron ejecute el script nuevamente.
Pero cuando reviso ps -aef --forest
mi proceso está ejecutado por /usr/sbin/CROND -n
. ¿Esto no fue malo para cron o sistema? ¿O tal vez debería hacerlo de otra manera?
Respuesta1
Quizás un breve ejemplo de un systemd
servicio sea suficiente.
Este es nuestro script infinito, ubicación /path/to/infinite_script
y conjunto de bits ejecutables:
#!/bin/bash
while ((1)) ; do
date >> /tmp/infinite_date
sleep 2
done
No, necesitamos definir un archivo de servicio:
[Unit]
#just what it does
Description= infinite date service
[Service]
#not run by root, but by me
User=fiximan
#we assume the full service as active one the script was started
Type=simple
#where to find the executable
ExecStart=/path/to/infinite_script
#what you want: make sure it always is running
Restart=always
[Install]
#which service wants this to run - default.target is just it is loaded by default
WantedBy=default.target
y colóquelo en/etc/systemd/system/infinite_script.service
Ahora cargue e inicie el servicio (como root):
systemctl enable infinite_script.service
systemctl start infinite_script.service
El servicio ya está funcionando y podemos comprobar su estado.
systemctl status infinite_script.service
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:18:52 CEST; 1min 33s ago
Main PID: 7349 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7349 /bin/bash /path/to/infinite_script
└─7457 sleep 2
Mai 28 14:18:52 <host> systemd[1]: Started infinite date service.
Ahora, si mata el script ( kill 7349
- PID principal) y verifica el estado nuevamente:
● infinite_script.service - infinite date service
Loaded: loaded (/etc/systemd/system/infinite_script.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2019-05-28 14:22:21 CEST; 12s ago
Main PID: 7583 (infinite_script)
Tasks: 2 (limit: 4915)
Memory: 1.5M
CGroup: /system.slice/infinite_script.service
├─7583 /bin/bash /path/to/infinite_script
└─7606 sleep 2
Mai 28 14:22:21 <host> systemd[1]: Started infinite date service.
Observe cómo se reinició instantáneamente con un nuevo PID.
Y verifique la propiedad del archivo de la salida:
ls /tmp/infinite/date
-rw-r--r-- 1 fiximan fiximan 300 Mai 28 14:31 infinite_date
Por lo tanto, el usuario correcto ejecuta el script según lo establecido en el archivo de servicio.
Por supuesto puedes detener y desactivar el servicio:
systemctl stop infinite_script.service
systemctl disable infinite_script.service
EDITAR:
Algunos detalles más: los servicios personales de un usuario pueden (de forma predeterminada) ubicarse $HOME/.config/systemd/user/
y administrarse en consecuencia con systemctl --user <commands>
. No se necesita root como ocurre con un crontab personal.
Respuesta2
mu.
cron es la herramienta incorrecta para este trabajo.
La herramienta adecuada es unasupervisor, uno que además incorpora la idea de reiniciar automáticamente los servicios cuando finalizan. (No todos lo hacen). Dichos administradores de servicios incluyen:
- Dan BernsteinDaemon Tools
- Adam Sampsonliberado
- Bruce Guenterdaemontools-encore
- Laurent Bercots6
- Gerrit Papeejecutarlo
- Wayne Marshalldelincuente
- lanzado (solo MacOS)
- systemd (solo Linux)
- fscd (solo FreeBSD)
- supervisor
- Micomida
Se crea una definición de servicio, apropiada para el administrador de servicios, que ejecuta el script de bucle infinito y lo agrega. Para varios de los administradores de servicios, se trata simplemente de un pequeño run
programa (normalmente un script en sí mismo) que ejecuta el script de bucle infinito. Los administradores de servicios realizan el inicio, el monitoreo y el reinicio automático.
Varios de los administradores de servicios se emplean fácilmente para realizar la administración de servicios por usuario, así como para todo el sistema, y se puede configurar esto como una definición de servicio por usuario de un servicio que se ejecuta como una cuenta propia y se puede administrar sin superusuario. privilegios (que requiere la gestión de servicios en todo el sistema).
Otras lecturas
- Joshua Timberman (29 de diciembre de 2012).Supervisión de procesos: problema resuelto.
- Larry Doolittle (23 de junio de 2005).Fundamentos del demonio Unix.
- Jonathan de Boyne Pollard (2015).La familia daemontools. Respuestas dadas con frecuencia.
- Asegúrese de que un proceso esté siempre en ejecución
- Cómo reiniciar un proceso automáticamente cuando finaliza en Linux/CentOS
Respuesta3
@FelixJN
Una advertencia: activar selinux puede impedir que se ejecute el script. Para que funcione, yo
lo moví a
/usr/local/bin
(que es una carpeta que admite Selinux)y editado
/etc/systemd/system/infinite_script.service
para corregirExecStart
en consecuenciacorrió
sudo restorecon -rv /usr/local/bin
para llevar esta información a selinux ycorrió
systemctl daemon-reload
hasta finalmentereiniciar el servicio
systemctl start infinite_script.service