Como executar um script periodicamente sem usar o crontab?

1

Como executar um script periodicamente como o crontab faz, mas sem usar o crontab?

Por favor note que o script executado não deve disparar com outro script e programá-lo com o comando 'sleep', o que eu espero ter a mesma funcionalidade do crontab, mas não deve estar presente na lista crontab e não deve parar quando o terminal ou sessão terminada,

crontab exatamente, mas sem croning-lo.

    
por devWeek 02.11.2016 / 08:22

2 respostas

3

A opção moderna é usar uma unidade% timer systemd . Isso requer a criação de uma unidade systemd que define o job que você deseja executar periodicamente e uma unidade systemd.timer que define o agendamento para o trabalho.

Supondo que você queira executar o trabalho como usuário comum, coloque esses arquivos em $HOME/.config/systemd/user :

my-job.service

[Unit]
Description=Job that needs periodic execution

[Service]
ExecStart=/path/to/your/script

my-job.timer

[Unit]
Description=Timer that periodically triggers my-job.service

[Timer]
OnCalendar=minutely

Em seguida, ative as unidades recém-criadas e inicie o cronômetro:

$ systemctl --user enable my-job.service my-job.timer
$ systemctl --user start my-job.timer

Para verificar se o timer está definido:

$ systemctl --user list-timers
NEXT                         LEFT     LAST                         PASSED UNIT         ACTIVATES
Wed 2016-11-02 14:07:00 EAT  19s left Wed 2016-11-02 14:06:37 EAT  3s ago my-job.timer my-job.service

journalctl -xe deve mostrar as entradas de log do trabalho que está sendo executado.

Consulte man systemd.timer para as muitas opções para configurar o comportamento do timer (incluindo inicialização aleatória, ativação do computador, persistência durante o tempo de inatividade, precisão do timer etc.) e man systemd.unit para documentação excelente sobre systemd e systemd unidades em geral.

    
por zwets 02.11.2016 / 12:13
2

Você pode executar um script com at e reprogramá-lo como sua instrução final. Por exemplo, assim:

$ cat > $HOME/my.job <<END
do this
do that
cat "$HOME/my.job" | at now + 5 minutes
END
$ sh ~/my.job

Para interromper o trabalho, remova-o da fila at :

$ atq
5       Wed Nov  2 11:25:00 2016 a zwets
$ atrm 5

Ou simplesmente remova o arquivo my.job para que a próxima execução de cat "$HOME/my.job" cause erro, então at não será invocado e o reagendamento não ocorrerá.

    
por zwets 02.11.2016 / 09:26