실행하면 가끔 먹통이 되는 프로그램을 일정 시간 내에 강제 종료시켜야 하는 필요가 있어 작성하였습니다.
(실제 사용하는 셸을 가능한 한 범용적으로 수정한 것이라 에러가 있을 수 있음)
1. 메인 스크립트 (proc_main.sh)
#!/bin/ksh
if [[ $# -lt 1 ]]; then
echo "need [timeout] (debug_id:optional) parameter"
exit 1
fi
DBG=:
DBGID=
DBGID2=
if [[ $# -eq 2 ]]; then
DBG=echo
DBGID=$3
DBGID2="$3_sub"
fi
SHPATH=/home/lawmin/
PIDKEY=$RANDOM
PIDPATH=$SHPATH/_pid_$PIDKEY
$SHPATH/proc_sub.sh $1 $PIDKEY $DBGID2 &
sleep 1 ;
$SHPATH/check_sleep.sh $2 $PIDPATH $DBGID;
if [ -f "$PIDPATH" ]; then
CON_PID=`cat $PIDPATH`
$DBG $DBGID ": forced kill [$1] (pid:$CON_PID)";
kill -9 $CON_PID;
rm $PIDPATH
fi
1) SHPATH 및 사용자 파라미터 값은 필요에 따라 추가하여 수정 필요
2) debug_id는 sleep, kill 등 진행 과정을 보고 싶을 때 입력
2. 서브 스크립트 (proc_sub.sh)
#!/bin/ksh
if [[ $# -lt 1 ]]; then
echo "need [pidkey] (debug_id:optional) parameters"
exit 1
fi
DBG=:
DBGID=
if [[ $# -eq 2 ]]; then
DBG=echo
DBGID="$2"
fi
SHPATH=/home/lawmin/
PIDPATH=$SHPATH/_pid_$1
#pid=`ps -ef | grep -v grep | grep PROGRAM" | awk '{print $2}'`
pid=$$
if [[ `echo $pid | wc -w | awk '{print $1}'` != 1 ]]; then
echo "not one process ID: $pid"
exit 1
fi
echo $pid > $PIDPATH
############## execute PROGRAM here ##############
rm $PIDPATH 2> /dev/null
exit 0
1) pidkey는 식별 가능한 임의의 값으로 세팅
2) debug_id는 sleep, kill 등 진행 과정을 보고 싶을 때 입력
3) pid는 기본적으로 자신의 pid이나, 다른 pid인 경우, 주석 부분 참고하여 수정
4) execute PROGRAM here 부분에 원하는 프로그램 실행
3. sleep 스크립트 (check_sleep.sh)
#!/bin/ksh
# Sleep until timeout or specified file cannot be found
if [[ $# -lt 2 ]]; then
echo "need [timeout] [check_file_path] (debug_id:optional) parameter"
exit 1
fi
DBG=:
DBGID=
if [[ $# -eq 3 ]]; then
DBG=echo
DBGID="$3"
fi
i=0
while (( i < $1 ))
do
(( i+=1 ))
if [ -f "$2" ]; then
sleep 1
$DBG $DBGID ": slept $i sec"
else
$DBG $DBGID ": met end condition (check file gone)"
exit 1
fi
done
exit 0
1) 지정한 파일[check_file_path]이 사라지거나(삭제 등), 지정한 시간[timeout]이 초과되거 전까지 sleep
2) debug_id는 sleep, kill 등 진행 과정을 보고 싶을 때 입력