Como interromper um script em um horário específico até que seja iniciado novamente pelo cron?

12

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

Eu configurei um trabalho 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

Anthony
fonte

Respostas:

25

Você pode executá-lo com o 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. 

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

Rabin
fonte
Minha conexão à Internet é lenta, por isso demora tanto tempo para sincronizar. Você recomendou algum sinal em particular?
Anthony
@ Anthony, como você sincroniza agora?
Rabin
lftp.tech
Anthony
@Anthony você pode tentar outra aplicação como syncthing ( syncthing.net ) ou BTSync ( resilio.com ), que o trabalho no nível de bloco do arquivo para sincronização
Rabin
9

Se 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 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 sua sincronização ou suas subtarefas ignoram sinais, mas não deixam detritos, faça isso

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

killallpsmisc

Roman Czyborra
fonte
Eu estou usando o script encontrado abaixo, com o espelho -c parece não se importar em ser reiniciado. Qual dos acima que você recomendaria ?: gist.github.com/feralhosting/4e7e93a7fecd8f55cb4a
Anthony
Vendo o script LFTP que deseja que o SIGTERM limpe seu arquivo de bloqueio e considerando a probabilidade de tempos limite do servidor em 17 horas ociosas ou ainda mais numerações inet [64], eu optaria pela 0 0 * * * timeout 7h /usr/local/bin/sync.shminha killall -TERMvariante equivalente .
Roman Czyborra
4

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

Em segundo lugar, você deseja ver a execução de tarefas crontab, 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 como isto:

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 matar o ID da sessão 4289:

   pkill -s 4289

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

ddlingo
fonte
O ID da sessão será alterado sempre que o trabalho cron for executado? E depois de desligar e ligar?
Anthony
sim isso vai mudar. Mas se você o script, você pode obter o PID e colocá-lo em uma variável. Você pode usar apenas o nome se ele aparecer. pkill sync.sh
ddlingo 5/17