프로세스를 강제 종료하기 전에 프로세스를 종료할 수 있도록 몇 초의 시간을 주려면 어떻게 해야 합니까?

프로세스를 강제 종료하기 전에 프로세스를 종료할 수 있도록 몇 초의 시간을 주려면 어떻게 해야 합니까?

종료하려는 프로세스의 PID가 있지만 -9를 수행하지 않고 정상적으로 종료할 수 있는 기회를 주고 싶습니다.

예상되는 동작: PID가 최대 10초 동안 계속 실행되고 있는지 확인하고 kill -9를 수행합니다.

한 줄로 이 작업을 수행할 수 있다면 보너스입니다.

답변1

더 나은 방법(다른 프로세스의 동일한 PID 종료를 방지하는)은 다음과 같습니다.

 function kill_gracefully() {  
    pid=$1; [[ -z $pid ]] && return;  # check arg
    kill $pid; # kill once

    i=0;    
    while kill -0 $pid; do  # while pid is alive
       sleep 0.1;      
       ((i+=1));  # count ++
       if [[ $i -gt 10 ]];then    # wait for 10 secs at most
           kill -9 $pid;          # kill if timeout
           break;  
       fi;
    done;     
}

위의 방법은 로드가 많은 시스템(자주 포크)에서는 실패할 수 있습니다.

답변2

kill -- "$pid"; sleep 10; kill -s KILL -- "$pid"

Debian 기반 시스템의 경우:

echo "$pid" | start-stop-daemon --pidfile /dev/stdin --stop --oknodo --name "$process_name" --user "$user" --retry 10

PID를 재사용하는 경우 잘못된 프로세스가 종료되는 것을 방지하기 위해 일치하는 기준(예: 사용자 이름 및 명령 이름)을 지정할 수 있습니다.

관련 정보