Um script de shell que nunca morre

0

Eu quero escrever um script de shell que nunca morre isto é O script de shell verificará repetidamente se o banco de dados está ativo ou não a cada cinco segundos. O problema é: Às vezes, o script de shell é interrompido / anulado por qualquer um.

Eu quero um script que se auto-intitule mesmo que pare / morra Existe alguma maneira de fazer isso?

    
por Ram 24.10.2013 / 16:59

4 respostas

8

Use um trabalho de crontab para chamar seu script.

crontab -e

Adicione a seguinte linha

* * * * * /path/to/your/script

Isso executará seu roteiro a cada minuto. Você pode verificar aqui como personalizar para outros tempos de execução. Página man do Crontab

Desculpe-me por ter perdido o requisito para ser executado a cada 5 segundos. Mas como Jonnhy mencionou nos comentários, você pode ter o cronjob verificando se o script está sendo executado ou não.

Script para crontab:

#!/usr/bin/bash
ps -ef|grep -v grep |grep script_name
if [ $? != 0 ]; then
    path/to/script/script_name
fi

No seu script:

#!/usr/bin/bash
while true; do
    #perform the test        
    sleep 5
done

Ou se você estiver usando um linux que ainda é baseado em scripts init, você pode, talvez, uma entrada para / etc / inittab

10:35:respawn:/path/ro/your/script

Embora eu não tenha certeza se é uma prática recomendada ter isso no inittab.

Se o seu sistema já está no systemd, também há uma maneira de fazer isso, mas não tenho experiência com ele para colocá-lo aqui.

    
por 24.10.2013 / 17:37
1

Em vez de usar um script com um loop infinito, use um script que execute a tarefa uma vez, mas primeiro durma por 5 segundos e, em seguida, chame a si mesmo em segundo plano:

sleep 5
$0 &
# do whatever

Isso pressupõe que o script esteja em $ PATH, já que é invocado apenas com o nome ( $0 ).

Se o script morrer / for eliminado durante "faça o que for", a próxima iteração ainda será executada.

    
por 24.10.2013 / 17:23
1

Se você tem privilégios de root, pode colocar seu script em / etc / inittab ou /etc/init/script.conf, dependendo de qual sistema seu sistema utiliza. Use as entradas para / sbin / getty como um exemplo de um processo que é sempre reiniciado quando morre.

    
por 24.10.2013 / 20:05
1

Contanto que o processo não esteja morrendo via SIGKILL, você pode usar trap , por exemplo:

#!/bin/bash

trap "" SIGHUP SIGINT SIGTERM

count=0
while ((1)); do
    echo $count
    sleep 2;
    count=$(($count+1));
done    

Você não pode Ctrl-C (SIGTERM) isso. Se você quiser que ele pare, você precisa usar kill -9 [pid] .

    
por 24.10.2013 / 20:38