サーバー環境の災害テストシナリオのために、プロセスをD(ノンストップスリープ)状態に切り替える簡単な方法を探しています。
簡単な方法がありますか? Cサンプルコードもあればいいと思います:)
編集する- プロセスはD状態にあるとマークされていますが、まだ信号を受信して終了する可能性があるため、最初の答えは不正確です。
ベストアンサー1
~からhttps://blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
プロセスは邪魔されない睡眠 (STAT D)
何かを待たなければならないとき(通常I/O)そして待っている間、信号を処理しないでください。これはkill
、Killが実行する操作がシグナルを送信するだけで、そうすることができないことを意味します。実際には、他のコンピュータがネットワークに接続されている間にNFSサーバーを切断すると、これが発生する可能性があります。
システムコールを活用して、vfork
限られた期間中に中断されない独自のプロセスを作成できます。コピーされたデータがスローされると予想されるため、アドレス空間が親から子にコピーされないことを除いてvfork
同様です。両親が待っている間私たちに便利fork
exec
vfork
ノンストップ(を通じて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
。