나는 결코 죽지 않는 쉘 스크립트를 작성하고 싶습니다. 즉, 쉘 스크립트는 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]
.