É possível executar uma tarefa cron a cada 30 segundos sem um comando de suspensão?
É possível executar uma tarefa cron a cada 30 segundos sem um comando de suspensão?
Respostas:
Se sua tarefa precisar ser executada com tanta frequência, o cron é a ferramenta errada. Além de simplesmente não iniciar trabalhos com tanta frequência, você também corre o risco de ter problemas sérios se o trabalho demorar mais para ser executado do que o intervalo entre os lançamentos. Reescreva sua tarefa para daemonize e execute persistentemente, em seguida, inicie-a no cron, se necessário (assegurando-se de que não será reiniciada se já estiver em execução).
run-one
para garantir que um programa / mesmo um script PHP não esteja iniciando uma instância duplicada. sudo apt-get install run-one
e chame-o porrun-one <normal command>
Candidato ao uso mais criativo de um comando do Linux:
nohup watch -n 30 --precise yourprog >/dev/null &
Se yourprog
consiste em:
date +%M.%S.%N >> yourprog.out
então yourprog.out
pode parecer com:
50.51.857291267
51.21.840818353
51.51.840910204
52.21.840513307
52.51.842455224
53.21.841195858
53.51.841407587
54.21.840629676
indicando um bom nível de precisão.
Aqui está uma explicação das partes do comando:
nohup
- Isso impede que o comando a seguir, watch
neste caso, saia quando o terminal sair.watch
- Este programa executa um comando repetidamente. Normalmente, a primeira tela cheia de saída do comando é exibida sempre que o comando é watch
executado.-n 30
- O intervalo no qual executar o comando. Nesse caso, é a cada trinta segundos.--precise
- Sem essa opção, watch
executa o comando após o intervalo de segundos. Com ele, cada início do comando começa no intervalo, se possível. Se essa opção não fosse especificada no exemplo, os tempos seriam posteriores e posteriores por mais de 30 segundos, devido ao tempo necessário para iniciar e executar o comando ( yourprog
).yourprog
- O programa ou linha de comando para watch
executar. Se a linha de comando contiver caracteres especiais para o shell (por exemplo, espaço ou ponto e vírgula), ela precisará ser citada.>/dev/null
- O maior que redireciona a saída do comando que está sendo executado watch
para um arquivo /dev/null
,. Esse arquivo descarta qualquer dado gravado nele. Isso evita que a saída seja gravada na tela ou, como nohup
está sendo usada, evita que a saída seja enviada para um arquivo chamado nohup.out
.&
- O watch
comando é executado em segundo plano e o controle é retornado ao terminal ou processo pai.Observe que nohup
o redirecionamento da saída e o &
operador de controle em segundo plano não são específicos watch
.
Aqui está uma explicação do yourprog
script de exemplo :
date
- Mostra a data e / ou hora atuais. Também pode configurá-los.+%M.%S.%N
- Isso especifica o formato de saída date
a ser usado. %M
é o minuto atual, %S
é o segundo atual e %N
é o nanossegundo atual.>> yourprog.out
- Isso redireciona a saída do date
comando para um arquivo chamado yourprog.out
. O duplo maior que faz com que a saída seja anexada ao arquivo em cada chamada, em vez de o conteúdo anterior ser substituído.Editar :
Possivelmente outra coisa que poderia ser abusada (ou talvez seja um uso legítimo) são os temporizadores do sistema.
Veja systemd / Timers como uma substituição cron e Cron vs systemd timers .
Vou tentar postar um exemplo em breve.
&
faz com que o comando seja executado em segundo plano, retornando o controle ao prompt de comando imediatamente. O uso do nohup
comando faz com que o processo em segundo plano (neste caso watch
) ignore o sinal de interrupção que é enviado quando o shell sai, como quando você fecha o terminal. ...
>/dev/null
faz com que a saída seja descartada e impede a criação de um nohup.out
arquivo que seria criado quando a saída padrão é um terminal.
sleep
, seria necessário escrever um loop para que o processo se repetisse ( watch
isso se repete para você, também cron
). Você ainda precisaria nohup
e &
. Um problema adicional sleep
seria o desvio do tempo. A --precise
opção de watch
evita isso. Sem ele ou ao usar sleep
em um loop, o intervalo de tempo tem o tempo que leva para os comandos ou script a ser executado adicionados a ele para cada corrida ganha cada vez mais tarde do que o ...
O Cron foi projetado para acordar a cada minuto, portanto, não é possível fazê-lo sem alguns hackers, por exemplo, dormir como você mencionou.
* * * * * /path/to/program
* * * * * sleep 30; /path/to/program
Não se esqueça de escrever algo em seu programa para que ele saia se uma instância anterior já estiver em execução.
#!/bin/sh
if ln -s "pid=$$" /var/pid/myscript.pid; then
trap "rm /var/pid/myscript.pid" 0 1 2 3 15
else
echo "Already running, or stale lockfile." >&2
exit 1
fi
Obviamente, isso ainda deixa uma oportunidade muito pequena de falha, portanto, pesquise no Google por uma solução melhor aplicável ao seu ambiente.
without a sleep command
Você pode fazer isso com software de terceiros.
Uma opção que funcionou bem para mim é o frequ-cron
Permite precisão de milissegundos e oferece a opção de adiar a próxima execução até que a atual seja encerrada.
Eu teria algumas preocupações:
(1) às vezes um sistema fica ocupado e não pode iniciar as coisas exatamente no ponto de 30 segundos, é possível que ao mesmo tempo em que você esteja executando um trabalho, outro trabalho seja exibido e você tenha 2 (ou mais) trabalhos fazendo o mesmo coisa. Dependendo do script, pode haver alguma interferência significativa aqui. Portanto, a codificação desse script deve conter algum código para garantir que apenas uma instância do script fornecido esteja sendo executada ao mesmo tempo.
(2) O script pode ter muita sobrecarga e consumir mais recursos do sistema do que você deseja. Isso é verdade se você estiver competindo contra muitas outras atividades do sistema.
Assim, como um pôster colocou, neste caso, eu consideraria seriamente colocar um daemon em execução com processos adicionais para garantir que ele permaneça em execução, se for de importância crítica para suas operações.
entrada cron:
* * * * * flock -w0 /path/to/script /path/to/script
roteiro:
while true;do echo doing something; sleep 10s;done
* * * * * flock -w0 /path/to/log watch -n 10 echo doing >> /path/to/log
ou
* * * * * flock -w0 /path/to/log watch -n 10 /path/to/script
flock
comando evita a execução do script por várias instâncias ao mesmo tempo. Pode ser muito importante na maioria dos casos.flock
e watch
comandos está disponível na maioria das instalações do Linuxwatch
comandoUma solução, se for para seu próprio script ou se você puder envolvê-lo:
Menos dor de cabeça do que construir e monitorar um daemon.
* Se você estiver usando PHP, lembre-se de clearstatcache ().