shell linux, mantenha a tarefa ativa por tempo especificado

4

Estou procurando uma ferramenta para manter uma tarefa ativa (reiniciando, se necessário) por um período de tempo especificado (em segundos) e depois a mando e parando. Por exemplo: keep_for 3600 rsync foo bar:faz deve tentar sincronizar um diretório (reiniciando o rsync no caso de conexão dropa), mas explicitamente elimina o rsync e pára de reaparecer após uma hora.

Eu tentei escrever um script de shell para isso, mas foi surpreendentemente difícil de escrever, com muitos casos de borda (como processo filho não sendo morto, ou problemas de escape de shell). Então ... talvez já exista uma ferramenta para isso?

    
por liori 07.05.2010 / 22:49

3 respostas

3

Se o seu sistema tiver o Upstart , você poderá criar um events arquivo para o seu script / comando e este may faz o que você quer (se não agora então possivelmente em uma versão futura usando recursos planejados ).

Aqui estão algumas informações da página events(5) man:

  • Início manual:

    start on <event>
    Describes on what condition to start this job. Without this section, the job can only be manually started with the initctl(8) command.

  • Respawn:

    respawn
    This sets the daemon, service, and respawn flags for the job. The respawn flag means that the process will be restarted when it ends

  • Limite de Respawn:

    respawn limit [count [timeout]]
    This configures respawn limits. Respawn limits only apply if the respawn flag is set for the job; setting a limit does not automatically set respawning capability. If the process is respawned more than count times within an interval of timeout seconds, the job will be stopped automatically, and not restarted. The limit defaults to 10 times within 5 seconds.

Veja Primeiros passos .

    
por 07.05.2010 / 23:27
0

Eu separaria as tarefas, mantendo-as no mesmo script (eu pensei nisso como um programa em C, mas deveria ser factível como um script).

Eu começaria com um temporizador de subprocesso em segundo plano para enviar um sinal no tempo limite. O manipulador de sinal encerra tudo limpo e sai.

Em seguida, inicie um loop que reproduza o comando desejado sempre que ele sair sem um status de sucesso (zero).

Tentar acompanhar o tempo limite e o comando em um loop será excessivamente complexo.

    
por 08.05.2010 / 04:30
-1

Esta questão é colocada em termos de uma implementação. Eu sugiro que você o re-enquadre em termos do que você está tentando realizar, o que pode gerar uma solução mais óbvia (e elegante).

    
por 08.05.2010 / 08:15