バッシュのゾンビ


11

バッシュはゾンビを作成していないようです。プロセスが強制終了されるとすぐに取得されるようです。

bashでゾンビを作れますか?


なぜ私が尋ねているのですか?

子プロセスを安全に強制終了できるようにしたい、またはkill -9一定期間内に停止しない場合は安全に終了できるようにしたいが、自分の子プロセスではないプロセスを誤って消去したくない。ゾンビプロセスは通常、非常に簡単で、レースコンディションを安全にします。


1
別のアイデアかもしれません...外部プロセスの強制終了から本当に保護したいなら、cgroupsをチェックしてください。呼び出しunshareてPID名前空間を作成し、そのプロセスツリー内から外部プロセスを分離してアクセスできないようにします。
オリオン2015

ジョブ制御を回避しようとするのではなく、ジョブ制御を使用します(ジョブ番号はkill -KILL %nどこにnあるかなど)。
名目上の動物

すばらしい質問です。しかし、「なぜあなたが尋ねているのか」に対する別のアプローチ:timeoutコマンドを検討しましたか?
ワイルドカード

回答:


13

ゾンビプロセスを作成するには:

$ (sleep 1 & exec /bin/sleep 10)

これは、実行さsleep 1れたシェルを置き換え、プロセスが終了した/bin/sleep 10ことを認識しないsleep 1ため、ゾンビを10秒間作成します。


ゾンビプロセスを殺すことで何が期待できるのかわかりません。ゾンビプロセスはすでに死んでいるので、殺すことはできません。

実際には、ゾンビプロセスを非表示にすることはできますが、ゾンビプロセス自体ではなく、その親を殺すことで可能です。


刈り取られたPIDはリサイクルされます。ゾンビのポイントは、親が子供を待って死を認めるまでPIDを予約することです。これがなければ、pidを殺すことは偶然の犠牲者をもたらす可能性があります。
PSkocik 2015

1
Cでは、子供を殺すときに偶然の犠牲者にならないようにすることができます。なぜなら、その子供を待つまで、その子供のPIDはリサイクルできないからです。シェルでも同じ保証ができるようになりたいのですが。
PSkocik 2015

3

それほど興味深い答えではありません:

$ (A=$BASHPID && ( kill -STOP $A ))

[1]+  Stopped                 ( A=$BASHPID && ( kill -STOP $A ) )

$ ps -C bash
  PID TTY          TIME CMD
29453 pts/0    00:00:00 bash
29593 pts/0    00:00:00 bash
29594 pts/0    00:00:00 bash <defunct>

これはゾンビプロセスですか?止まっただけです。また、$BASHPIDある$$と思います。
Gabor Csardi、2018

$BASHPID と同じではありません$$。次のコードを試してください: echo $$ $BASHPID ;echo $(echo $$ $BASHPID)。詳細については、を参照してくださいman bash
Alex Baranowski、2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.