OS

프로세스가 지정한 시간 동안 끝나지 않으면 강제 종료 (kill process on timeout)

Lawmin 2023. 4. 5. 16:55

실행하면 가끔 먹통이 되는 프로그램을 일정 시간 내에 강제 종료시켜야 하는 필요가 있어 작성하였습니다.

(실제 사용하는 셸을 가능한 한 범용적으로 수정한 것이라 에러가 있을 수 있음)

 

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 등 진행 과정을 보고 싶을 때 입력