¿Cómo detener un script en un momento específico hasta que cron lo inicie nuevamente?

12

Tengo un Raspberry Pi con OSMC (basado en Debian).

He configurado un trabajo cron para iniciar un script, sync.sh, a medianoche.

0 0 * * * /usr/local/bin sync.sh

Necesito detener el guión a las 7 am. Actualmente estoy usando:

0 7 * * * shutdown -r now

¿Hay una mejor manera? Siento que reiniciar es excesivo.

Gracias

Antonio
fuente

Respuestas:

25

Puedes ejecutarlo con el timeoutcomando ,

timeout - run a command with a time limit

Synopsis
timeout [OPTION] NUMBER[SUFFIX] COMMAND [ARG]...
timeout [OPTION]
Description

Start COMMAND, and kill it if still running after NUMBER seconds. SUFFIX may be 's' for seconds (the default), 'm' for minutes, 'h' for hours or 'd' for days. 

PD. Si su proceso de sincronización lleva demasiado tiempo, puede considerar un enfoque diferente para sincronizar sus datos, tal vez bloquear la replicación.

Rabin
fuente
Mi conexión a Internet es lenta, por lo tanto, por qué tarda tanto en sincronizarse. ¿Recomendarías alguna señal en particular?
Anthony
@ Anthony, ¿cómo se sincroniza ahora?
Rabin
lftp.tech
Anthony
Más específicamente: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
Anthony
@Anthony puedes probar otras aplicaciones como syncthing ( syncthing.net ) o BTSync ( resilio.com ), que funcionan en el nivel de bloqueo del archivo para sincronizar
Rabin
9

Si su sincronización puede continuar fácilmente después de 17 horas de hibernación, intente

0 0 * * * killall -CONT -g sync.sh || /usr/local/bin/sync.sh
7 0 * * * killall -STOP -g sync.sh

Si su sincronización prefiere reiniciar desde el principio, intente

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -TERM -g sync.sh

Si su sincronización o sus subtareas ignoran las señales pero no dejan escombros, haga que

0 0 * * * exec /usr/local/bin/sync.sh
7 0 * * * killall -KILL -g sync.sh

killallpsmisc

Roman Czyborra
fuente
Estoy usando el script que se encuentra a continuación, con mirror -c no parece importar que se reinicie. ¿Cuál de los anteriores recomendaría ?: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
Anthony
Al ver esa secuencia de comandos LFTP que desea que un SIGTERM limpie su archivo de bloqueo y teniendo en cuenta la probabilidad de tiempos de espera del servidor en 17 horas inactivas o incluso peores renumeraciones inet [64], optaría por 0 0 * * * timeout 7h /usr/local/bin/sync.shmi killall -TERMvariante en su mayoría equivalente .
Roman Czyborra
4

También usaría cron para "detener" o "matar" ese servicio o script en un momento específico.
Primero cree su trabajo cron para ejecutar su trabajo o script. (puede ejecutar fácilmente otro cron que matará un trabajo que tiene un nombre sudo pkill wget)

En segundo lugar, desea ver la ejecución de tareas crontab, en un formato útil y legible, en la salida de:

   ps -o pid,sess,cmd afx | egrep "( |/)cron( -f)?$"

Aparecerán en las primeras líneas, algo como esto:

1108  1108 cron
4288  1108 \_ CRON
4289  4289     \_ /bin/sh -c /path/to/my/crontab/script1.sh
4290  4289         \_ /bin/bash /path/to/my/crontab/script1.sh
4295  4289             \_ /usr/bin/wget LINK

La primera columna es PID, la segunda es la ID de sesión y la tercera es el comando iniciado por cron. Puede eliminar todos los procesos relacionados con una tarea cron específica utilizando la ID de sesión, por lo que en el ejemplo anterior debe eliminar la ID de sesión 4289:

   pkill -s 4289

Debe poner el pkill en un script y ejecutar esto como un cron

ddlingo
fuente
¿Cambiará la ID de sesión cada vez que se ejecute el trabajo cron? ¿Qué pasa después de apagar y encender?
Anthony
Sí, va a cambiar. Pero si lo escribe, puede obtener el PID y colocarlo en una variable. Es posible que pueda usar el nombre si aparece. pkill sync.sh
ddlingo