プロセスを強制終了する前にプロセスを終了できるように、数秒の時間を費やすにはどうすればよいですか?

プロセスを強制終了する前にプロセスを終了できるように、数秒の時間を費やすにはどうすればよいですか?

終了したいプロセスのPIDがありますが、-9を実行せずに正常に終了する機会を与えたいと思います。

予想される動作:PIDが最大10秒間実行され続けていることを確認し、kill -9を実行します。

1行でこれを行うことができればボーナスです。

答え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を再利用する場合は、間違ったプロセスが終了するのを防ぐために、一致する基準(ユーザー名やコマンド名など)を指定できます。

関連情報