mu.

mu.

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 --forestmi 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 systemdservicio sea suficiente.

Este es nuestro script infinito, ubicación /path/to/infinite_scripty 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:

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 runprograma (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

Respuesta3

@FelixJN

Una advertencia: activar selinux puede impedir que se ejecute el script. Para que funcione, yo

  1. lo moví a /usr/local/bin(que es una carpeta que admite Selinux)

  2. y editado /etc/systemd/system/infinite_script.servicepara corregir ExecStarten consecuencia

  3. corrió sudo restorecon -rv /usr/local/binpara llevar esta información a selinux y

  4. corrió systemctl daemon-reloadhasta finalmente

  5. reiniciar el serviciosystemctl start infinite_script.service

información relacionada