Como verificar e executar um script se ele não estiver sendo executado?

2

Eu criei um script bem simples chamado main_start_script que executará 2 programas python em segundo plano, o código é:

python /opt/cuckoo/cuckoo-2/cuckoo.py 1>cuckoo_script/cuckoo_start.txt 2>&1 &
python /opt/cuckoo/cuckoo-2/utils/web.py 1>cuckoo_script/web_start.txt 2>&1 &

Agora, pergunto-me como posso verificar se esses dois programas estão sendo executados e, caso contrário, executar o script para iniciá-los.

Eu ouvi pessoas recomendarem o uso de "Puppet" para verificar, mas ainda não encontrei um tutorial útil.

    
por Xiechen 28.06.2016 / 22:34

2 respostas

2

Veja esta pergunta semelhante sobre o stackoverflow . O comando pgrep pode verificar a existência de um processo em execução.

O comman pgrep -f <file> retornará o número de instâncias atuais do arquivo especificado. Por exemplo:

[user@localhost ~]$ pgrep -f /sbin/init
1
[user@localhost ~]$

Ele não retornará nada se o arquivo não estiver associado a um processo.

Isso pode ser incorporado em um script bash que executará o script se ainda não estiver em execução:

#!/bin/bash
if [[ ! $(pgrep -f script.sh) ]]; then
    script.sh
fi
    
por 28.06.2016 / 23:03
2

Salve o número PID de cada comando usando o shell especial '$!' do bash que é o processo pid do último comando, então apenas verifique a existência '/ proc / PID' antes de tentar executar o comando novamente.

#!/bin/bash

do_cuckoo() {
  python /opt/cuckoo/cuckoo-2/cuckoo.py 1>cuckoo_script/cuckoo_start.txt 2>&1 & echo $! >/tmp/cuckoo.pid
}
do_web() {
  python /opt/cuckoo/cuckoo-2/utils/web.py 1>cuckoo_script/web_start.txt 2>&1 & echo $! >/tmp/web.pid
}

do_cuckoo && do_web # First time run

# You should add a proper sleep timer below.
while :; do
  [ ! -d /proc/$(</tmp/cuckoo.pid) ] && do_cuckoo
  [ ! -d /proc/$(</tmp/web.pid) ] && do_web
done

Talvez em vez desse loop while seja melhor usar 'until'. Eu vou deixar você para essas tarefas;)

    
por 28.06.2016 / 23:41