스크립트가 실행되고 있지 않은 경우 어떻게 확인하고 실행합니까?

스크립트가 실행되고 있지 않은 경우 어떻게 확인하고 실행합니까?

main_start_script백그라운드에서 2개의 Python 프로그램을 실행하는 매우 간단한 스크립트를 만들었습니다 . 코드는 다음과 같습니다.

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 &

이제 이 두 프로그램이 실행 중인지 확인하는 방법과 그렇지 않은 경우 스크립트를 실행하여 시작하는 방법을 알고 싶습니다.

사람들이 확인을 위해 "Puppet"을 사용하는 것이 좋다고 들었지만 지금까지 유용한 튜토리얼을 찾지 못했습니다.

답변1

이것 좀 봐비슷한 계산기 질문. 이 pgrep명령은 실행 중인 프로세스가 존재하는지 확인할 수 있습니다.

이 명령은 pgrep -f <file>지정된 파일의 현재 인스턴스 수를 반환합니다. 예를 들어:

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

파일이 프로세스와 연결되어 있지 않으면 아무것도 반환하지 않습니다.

아직 실행되고 있지 않은 경우 이를 실행하는 bash 스크립트에 통합할 수 있습니다.

#!/bin/bash
if [[ ! $(pgrep -f script.sh) ]]; then
    script.sh
fi

답변2

bash의 특수 쉘 var '$!'를 사용하여 각 명령의 PID 번호를 저장하십시오. 이는 마지막 명령의 프로세스 pid입니다. 그런 다음 명령을 다시 실행하기 전에 "/proc/PID"가 있는지 확인하십시오.

#!/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

어쩌면 while 루프 대신 "until"을 사용하는 것이 더 나을 수도 있습니다. 그 일은 당신에게 맡기겠습니다 ;)

관련 정보