Ejecutar mientras sea verdadero en el script systemd

8

Obtuve un script bash esencialmente ejecutando esto:

#!/bin/bash

[...]

 while true; do
         str="broadcast "`randArrayElement "messages[@]"`
         server_send_message $str
         sleep $interval
 done

Ahora quiero ejecutar esto como un servicio systemd, mi script de servicio se ve así:

[Unit]
Description=Announcer
After=network.target

[Service]
ExecStart=/usr/local/bin/somescript &; disown
ExecStop=/usr/bin/kill -9 `cat /tmp/somescript.pid`
Type=forking
PIDFile=/tmp/somescript.pid

[Install]
WantedBy=default.target

Desafortunadamente, cuando ejecuto este servicio a través de service somescript startél, funciona, pero debido al bucle while true, mi terminal se atasca al iniciar el script:

 somescript.service - somescript service
   Loaded: loaded (/etc/systemd/system/somescript.service; disabled; vendor preset: enabled)
   Active: activating (start) since Wed 2016-08-17 12:22:34 CEST; 43s ago
  Control: 17395 (somescript)
   CGroup: /system.slice/somescript.service
           ├─17395 /bin/bash /usr/local/bin/somescript &; disown
           └─17409 sleep 600

¿Cómo puedo ejecutar este script como un servicio sin quedar atrapado en el "inicio" / el ciclo verdadero?

Flatron
fuente

Respuestas:

8

Debe dejar que systemd trabaje para usted. Deje que se encargue de la bifurcación al comienzo y la finalización del proceso. Por ejemplo, reemplace su parte de servicio por

[Service]
Type=simple
ExecStart=/usr/local/bin/somescript
PIDFile=/tmp/somescript.pid

entonces puedes usar systemctl start, statusy stop. Debe recordar que las líneas en systemd NO son interpretadas por el shell, por &;lo que simplemente se pasa como otro parámetro de 2 caracteres a su script.

meuh
fuente
Bien gracias, hice los cambios. Lamentablemente, el script todavía se cuelga al intentar iniciarlo como antes.
Flatron
1
¿Te acordaste de hacer sudo systemctl daemon-reload?
meuh
¿Sabes estos momentos que crees que ya hiciste algo aunque no lo hiciste? Gracias funciona! :)
Flatron
1

Dependiendo de sus requisitos, puede considerar reemplazar su bucle por una configuración de temporizador systemd. No iniciará el servicio dos veces, incluso si server_send_message tarda más que "OnUnitActiveSec":

somescript.timer

[Unit]
Description=Announce every minute

[Timer]
OnUnitActiveSec=1m
AccuracySec=10s
Unit=somescript.service

[Install]
WantedBy=default.target

Parte del servicio somescript.service:

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c 'str="broadcast "`randArrayElement "messages[@]"`; server_send_message $str'
Gerrit Griebel
fuente