D状態で終了できないプロセスシミュレーション

D状態で終了できないプロセスシミュレーション

サーバー環境の災害テストシナリオのために、プロセスをD(ノンストップスリープ)状態に切り替える簡単な方法を探しています。

簡単な方法がありますか? Cサンプルコードもあればいいと思います:)

編集する- プロセスはD状態にあるとマークされていますが、まだ信号を受信して​​終了する可能性があるため、最初の答えは不正確です。

ベストアンサー1

~からhttps://blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the

プロセスは邪魔されない睡眠 (STAT D)何かを待たなければならないとき(通常I/O)そして待っている間、信号を処理しないでください。これはkill、Killが実行する操作がシグナルを送信するだけで、そうすることができないことを意味します。実際には、他のコンピュータがネットワークに接続されている間にNFSサーバーを切断すると、これが発生する可能性があります。

システムコールを活用して、vfork限られた期間中に中断されない独自のプロセスを作成できます。コピーされたデータがスローされると予想されるため、アドレス空間が親から子にコピーされないことを除いてvfork同様です。両親が待っている間私たちに便利forkexecvforkノンストップ(を通じてwait_on_completion)子供のexecまたはexit

jesstess@aja:~$ cat uninterruptible.c 
int main() {
    vfork();
    sleep(60);
    return 0;
}
jesstess@aja:~$ gcc -o uninterruptible uninterruptible.c
jesstess@aja:~$ echo $$
13291
jesstess@aja:~$ ./uninterruptible
and in another shell:

jesstess@aja:~$ ps -o ppid,pid,stat,cmd $(pgrep -f uninterruptible)

13291  1972 D+   ./uninterruptible
 1972  1973 S+   ./uninterruptible

子プロセス(PID 1973, PPID 1972)は中断可能なスリープ状態にあり、親プロセス(PID 1972, PPID 13291--shell )は子プロセスが60秒間待機している間中断できないスリープ状態にあることがわかります。

このスクリプトの1つのきちんとした(いたずらな)点は、中断されていないスリープ状態のプロセスがシステムの負荷平均に影響を与えることです。したがって、このスクリプトを100回実行して、コンピュータの負荷平均を一時的に100回増やすことができますuptime

おすすめ記事