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