본문 바로가기

개발/Bash, Shell Script

pid가 동작하는 중인지 확인하는 방법

    FIND=`ssh -n -p $port $ip find ${PATH} -name "*.[파일형식]"`

    if [ -n "${FIND}" ]; then
      PREV_PID=`ssh -n -p $port $usr@$ip cat ${FIND}` # pid #74535
      CHECK_STAT=`ssh -n -p $port $usr@$ip ps -f ${PREV_PID} | awk 'NR == 2 {print $7}'` # bash: /proc/74535: 파일이 존재하고 디렉토리인 경우
     
      echo "${target} CHECK_STAT : "${CHECK_STAT}""

      # pid 문자열이 존재하고 pid의 STAT이 D, T, X, Z 로 시작하지 않고 STAT이 공백이 아니면
      # STAT : D -> 입출력 대기로 깨울 수 없는 수면 상태
      # STAT : T -> 일시 정지
      # STAT : X -> 사망
      # STAT : Z -> 프로세스 작동이 잘못되어 죽은 좀비 상태
      if [[ -n "${PREV_PID}" ]] && [[ "${CHECK_STAT}" != "D"* && "${CHECK_STAT}" != "T"* && "${CHECK_STAT}" != "X"* && "${CHECK_STAT}" != "Z"* ]] && [[ -n "${CHECK_STAT}" ]]; then
        echo "process exists"
      else
        send_message
      fi

ps -f $pid 의 STAT 부분에서 pid의 상태를 체크할 수 있다.  

상태가

       STAT : D -> 입출력 대기로 깨울 수 없는 수면 상태
       STAT : T -> 일시 정지
       STAT : X -> 사망
       STAT : Z -> 프로세스 작동이 잘못되어 죽은 좀비 상태

가 아니라면 살아 있는 것으로 체크할 수 있다.

 

혹은 명령어에 pid파일을 남기는 것이 명시되어 있을 경우

$pid에 파일 경로를 담고 grep으로 해당 pid가 담긴 명령어가 실행 중인지 체크할 수 있다.

    pids=`ssh -n -p $port $ip ps -aux | grep $pid | wc -l`
    if [ $pids -gt 0 ]; then
      echo "file exists"
    else
      send_message
    fi