Como parar um script em um momento específico até que ele seja iniciado novamente pelo cron?

12

Eu tenho um Raspberry Pi executando o OSMC (baseado no Debian).

Eu configurei uma tarefa do cron para iniciar um script, sync.sh, à meia-noite.

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

Eu preciso parar o script às 7 da manhã. Atualmente estou usando:

0 7 * * * shutdown -r now

Existe uma maneira melhor? Eu sinto que reiniciar é um exagero.

Obrigado

    
por Anthony 05.01.2017 / 15:21

3 respostas

24

Você pode executá-lo com o timeout command

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. 

PS. Se o processo de sincronização levar muito tempo, você poderá considerar uma abordagem diferente para sincronizar seus dados, talvez bloquear a replicação.

    
por 05.01.2017 / 15:27
9

Se a sua sincronização puder continuar facilmente após 17 horas de hibernação, tente

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

Se a sua sincronização preferir reiniciar desde o início, tente

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

Se a sua sincronização ou subtarefas ignorarem os sinais, mas não deixarem resíduos, faça isso

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

killall psmisc

    
por 05.01.2017 / 18:52
4

Eu também usaria o cron para "parar" ou "matar" esse serviço ou script em um horário especificado.
Primeiro crie seu cron job para executar seu trabalho ou script. (você pode facilmente executar outro cron que mata um trabalho que tem um nome sudo pkill wget )

Em segundo lugar, você deseja ver as tarefas do crontab em execução, em um formato útil e legível, na saída de:

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

Eles aparecerão nas primeiras linhas, algo assim:

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

A primeira coluna é PID, a segunda é a ID da sessão e a terceira é o comando iniciado pelo cron. Você pode matar todos os processos relacionados a uma tarefa Cron específica usando o ID da sessão, portanto, no exemplo acima, você deve eliminar o ID da sessão 4289:

   pkill -s 4289

Você precisa colocar o pkill em um script e executá-lo como um cron

    
por 05.01.2017 / 16:31