결코 죽지 않는 쉘 스크립트

결코 죽지 않는 쉘 스크립트

나는 결코 죽지 않는 쉘 스크립트를 작성하고 싶습니다. 즉, 쉘 스크립트는 5초마다 데이터베이스가 살아 있는지 반복적으로 확인합니다. 문제는 때때로 쉘 스크립트가 비정상적으로 중지되거나 두 스크립트 중 하나에 의해 종료된다는 것입니다.

중지되거나 종료된 경우에도 스스로 호출되는 스크립트를 원합니다. 이를 수행할 수 있는 방법이 있습니까? ? ?

답변1

crontab 작업을 사용하여 스크립트를 호출하십시오.

crontab -e

다음 줄을 추가하세요

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

그러면 매분마다 스크립트가 실행됩니다. 여기에서 다른 실행 시간을 사용자 정의하는 방법을 확인할 수 있습니다.크론탭 매뉴얼 페이지

죄송합니다. 5초마다 실행해야 하는 요구 사항을 놓쳤습니다. 그러나 주석에서 Jonnhy가 언급한 것처럼 cronjob을 통해 스크립트가 실행 중인지 확인할 수 있습니다.

크론탭 스크립트:

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

스크립트에서:

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

또는 여전히 init 스크립트를 기반으로 하는 Linux를 사용하는 경우 /etc/inittab에 액세스할 수 있습니다.

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

inittab에 넣는 것이 최선의 방법인지는 확실하지 않습니다.

시스템에 이미 systemd가 설치되어 있는 경우 이를 수행할 수 있는 방법도 있지만 여기에 넣을 경험이 없습니다.

답변2

무한 루프가 있는 스크립트를 사용하는 대신 작업을 한 번 수행하지만 처음에는 5초 동안 절전 모드로 전환한 다음 백그라운드에서 자신을 호출하는 스크립트를 사용하세요.

sleep 5
$0 &
# do whatever

스크립트는 $0이름( )만 사용하여 호출되므로 $PATH에 있는 것으로 간주됩니다.

"무엇이든 수행" 중에 스크립트가 죽거나 종료되면 다음 반복이 계속 실행됩니다.

답변3

루트 권한이 있는 경우 시스템에서 사용하는 시스템에 따라 /etc/inittab 또는 /etc/init/script.conf에 스크립트를 배치할 수 있습니다. 종료 시 항상 다시 시작되는 프로세스의 예로 /sbin/getty에 대한 항목을 사용하십시오.

답변4

프로세스가 SIGKILL을 통해 종료되지 않는 한 다음 trap과 같이 사용할 수 있습니다.

#!/bin/bash

trap "" SIGHUP SIGINT SIGTERM

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

이를 달성하기 위해 Ctrl-C(SIGTERM)를 사용할 수 없습니다. 중지하려면 를 사용해야 합니다 kill -9 [pid].

관련 정보