programing

프로세스가 정지된 경우 프로세스를 재시작하는 bash 스크립트를 작성하려면 어떻게 해야 합니까?

javajsp 2023. 4. 19. 22:15

프로세스가 정지된 경우 프로세스를 재시작하는 bash 스크립트를 작성하려면 어떻게 해야 합니까?

큐를 체크하고 각 항목에 대해 액션을 수행하는 python 스크립트가 있습니다.

# checkqueue.py
while True:
  check_queue()
  do_something()

실행 중인지 확인하고 실행 중이지 않으면 시작하는 bash 스크립트를 작성하려면 어떻게 해야 합니까?과 같은 코드, 하다, , 하다, 하다, 하다, 등)입니다.ps | grep

# keepalivescript.sh
if processidfile exists:
  if processid is running:
     exit, all ok

run checkqueue.py
write processid to processidfile

crontab에서 그렇게 부르겠습니다.

# crontab
*/5 * * * * /path/to/keepalivescript.sh

자식 이외의 프로세스를 평가하려는 PID 파일, cron 또는 기타 모든 것을 피하십시오.

UNIX에서 자녀만 기다릴 수 있는 데는 충분한 이유가 있습니다.회피하려고 하는 메서드(ps 구문 분석, pgrep, PID 저장 등)에 결함이 있어 틈이 있습니다.그냥 싫다고 해.

대신 프로세스를 모니터링하는 프로세스가 프로세스의 상위 항목이 되어야 합니다.이것은 무엇을 의미합니까?즉, 공정을 시작하는 공정만이 공정이 끝날 때까지 안정적으로 기다릴 수 있습니다.bash에서는 이건 정말 사소한 일이에요.

until myserver; do
    echo "Server 'myserver' crashed with exit code $?.  Respawning.." >&2
    sleep 1
done

는 "bash"를 실행합니다.myserver an until첫은 " " " 입니다. 첫 번째 행이 시작됩니다.myserver끝날 때까지 기다리죠.되면, 「 」until는 종료 상태를 확인합니다.가 " " "인 "0정상적으로 종료된 것을 의미합니다(즉, 어떻게든 셧다운을 요구해 정상적으로 종료한 것을 의미합니다).이 경우는, 재기동하고 싶지 않습니다(셧다운을 요구했을 뿐입니다).종료 상태가 이 아닌 경우 0,until는 루프 본체를 실행하여 STDERR에서 오류 메시지를 발송하고 1초 후에 루프(회선1로 돌아가기)를 재시작합니다.

왜왜리리리리리리리리? 냐하, 의의, 의 sequence, 의 of, 의 of의 myserver즉시 크래쉬가 발생합니다.재기동이나 크래쉬를 반복하는 매우 집중적인 루프가 매우 심합니다.sleep 1스트레스를 없애줄 수 있습니다.

이 스크립트를 (아마도 "bash" ("bash", "bash", "bash", "bash", "bash", "bash", "bash", "bash", "bash", "bash" 가 감시됩니다.이 스크립트가 모니터 됩니다.myserver이치노(1)에서 「」( 「서바이브」재기동 「cron(1)」를 사용해 할 수 .@reboot을 ". cron"으로 엽니다.crontab:

crontab -e

그런 다음 모니터 스크립트를 시작하는 규칙을 추가합니다.

@reboot /usr/local/bin/myservermonitor

"inittab(5)" /etc/inittab" "inittab은 "/etc/inittab" 입니다.하여 " " " " 를 가질 수 .myserver특정 초기 수준에서 시작하여 자동으로 다시 시작됩니다.


편집.

PID 파일을 사용하지 않는 이유에 대한 정보를 추가하겠습니다.그들은 매우 인기가 있지만, 그들은 또한 매우 결점이 있고, 당신이 그것을 단지 올바른 방법으로 하지 않을 이유는 없다.

다음 사항을 고려하십시오.

  1. PID 재활용(잘못된 프로세스 중지):

    • /etc/init.d/foo start : 작작foo , 기 ,foo에서 PID로/var/run/foo.pid
    • 후 : ★★★★★★★★★★★★★★★★★★」foo어떻게든 죽는다.
    • : 기동하는 을 「」라고 부릅니다.barPID를 하고, 해 주세요.fooPID가 되다.
    • 요?foo사라졌습니다:/etc/init.d/foo/restart/var/run/foo.pid하고 있는지 하고, finds, finds, finds, finds, findsbar it , 、 、 、 、 。foo 새로운 foo.
  2. PID 일 pid pid pid pid pid 。 여부를 복잡한하며, PID에 합니다.1..

  3. 쓰기 액세스 권한이 없거나 읽기 전용 환경에 있는 경우에는 어떻게 해야 합니까?

  4. 이것은 무의미한 과장입니다.위의 예가 얼마나 간단한지 확인해 주세요.복잡하게 만들 필요 없어

다음 항목도 참조하십시오.PID 파일은 '올바른' 경우에도 결함이 있습니까?

그건 그렇고, PID 파일보다 더 안 좋은 것은 파싱이야! 절대 이러지 마.

  1. ps이치노거의 모든 UNIX 시스템에서 찾을 수 있지만, 비표준 출력을 원할 경우 인수가 크게 달라집니다.또한 표준 출력은 사람만 사용할 수 있으며 스크립트 구문 분석에는 사용할 수 없습니다.
  2. 분석ps잘못된 긍정의 결과로 이어집니다.ps aux | grep PID예를 들어, 데몬을 시작한 PID와 같은 인수로 어딘가에서 번호를 사용하여 프로세스를 시작하는 사람을 상상해 보십시오.두 사람이 X 세션을 시작하고 X가 당신을 죽이기 위해 X를 위해 greping한다고 상상해보세요.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

프로세스를 직접 관리하고 싶지 않은 경우 프로세스의 모니터 역할을 하는 완벽한 시스템이 몇 가지 있습니다.를 들어 runit을 조사합니다.

monit(http://mmonit.com/monit/)을 참조해 주세요.스크립트의 시작, 중지 및 재시작을 처리하고 필요에 따라 상태 점검 및 재시작을 수행할 수 있습니다.

또는 간단한 스크립트를 수행합니다.

while true
do
/your/script
sleep 1
done

인라인:

while true; do <your-bash-snippet> && break; done

은 연속적으로 합니다.<your-bash-snippet>발생했을 : 「」&& break가 정지됩니다.<your-bash-snippet> 코드)0를 참조해 주세요.

「」를 <your-bash-snippet>든든: :

while true; do <your-bash-snippet>; done

예: #1

while true; do openconnect x.x.x.x:xxxx && break; done

예: #2

while true; do docker logs -f container-name; sleep 2; done

가장 쉬운 방법은 무리지어 파일을 만드는 것입니다.Python 스크립트로 하면

lf = open('/tmp/script.lock','w')
if(fcntl.flock(lf, fcntl.LOCK_EX|fcntl.LOCK_NB) != 0): 
   sys.exit('other instance already running')
lf.write('%d\n'%os.getpid())
lf.flush()

셸에서는 실제로 실행 중인지 테스트할 수 있습니다.

if [ `flock -xn /tmp/script.lock -c 'echo 1'` ]; then 
   echo 'it's not running'
   restart.
else
   echo -n 'it's already running with PID '
   cat /tmp/script.lock
fi

를 할 실행 중이고 다시 가 됩니다.이미 실행 중이고 재시작하면 다음 명령을 사용하여 종료되기 때문입니다.'other instance already running'

프로세스가 정지하면 모든 파일 기술자가 닫히고 모든 잠금이 자동으로 제거됩니다.

시스템상의 다양한 사항을 감시하고 이에 따라 대응할 수 있는 표준 Unix 툴인 monit을 사용해야 합니다.

자료 : http://mmonit.com/monit/documentation/monit.html#pid_testing

프로세스 체크큐를 확인합니다.py에 pidfile /var/run/checkqueue를 지정합니다.pidpid가 변경된 경우 exec "checkqueue_sec.sh"

또한 재시작할 때 이메일을 보내도록 monit을 구성할 수도 있습니다.

if ! test -f $PIDFILE || ! psgrep `cat $PIDFILE`; then
    restart_process
    # Write PIDFILE
    echo $! >$PIDFILE
fi
watch "yourcommand"

(2초 지연 후) 정지 시 프로세스를 재시작합니다.

watch -n 0.1 "yourcommand"

기본 2초가 아닌 0.1초 후에 재시작하려면

watch -e "yourcommand"

중지하려면 프로그램이 종료되고 오류가 발생한 경우 재시작합니다.

장점:

  • 삽입 명령어
  • 한 줄
  • 사용하기 쉽고 기억하기 쉽다.

결점:

  • 명령이 완료된 후에만 화면에 표시

여러 운영 체제에서 얼마나 휴대 가능한지는 모르겠지만 시스템에 'run-one' 명령어(즉, 'man run-one')가 포함되어 있는지 확인할 수 있습니다.특히 이 명령어 세트에는 '1회 연속 실행'이 포함되어 있으며, 이것이 정확히 필요한 것으로 보입니다.

man 페이지부터:

run-one-constant command [ARGS]

주의: 스크립트 내에서 호출할 수도 있지만 스크립트를 사용할 필요도 전혀 없습니다.

수많은 서버에서 다음 스크립트를 사용하여 성공을 거두고 있습니다.

pid=`jps -v | grep $INSTALLATION | awk '{print $1}'`
echo $INSTALLATION found at PID $pid 
while [ -e /proc/$pid ]; do sleep 0.1; done

주의:

  • jps를 사용할 수 있도록 Java 프로세스를 요구하고 있습니다.이것은 ps보다 배포 전체에서 훨씬 일관성이 있습니다.
  • $INSTALLATION에는 프로세스 되어 있어 않습니다.
  • 프로세스가 종료되기를 기다리는 동안 sleep을 사용하여 리소스를 독점하지 마십시오.

이 스크립트는 실제로 실행 중인 Tomcat 인스턴스를 셧다운하기 위해 사용되며 명령줄에서 셧다운(및 대기)하기 때문에 자녀 프로세스로 실행하는 것은 선택사항이 아닙니다.

npm 프로세스에 사용합니다.

#!/bin/bash
for (( ; ; ))
do
date +"%T"
echo Start Process
cd /toFolder
sudo process
date +"%T"
echo Crash
sleep 1
done

언급URL : https://stackoverflow.com/questions/696839/how-do-i-write-a-bash-script-to-restart-a-process-if-it-dies