Zombi di bash

11

Bash tampaknya tidak membuat zombie. Sepertinya proses mendapatkan segera menuai ketika mereka terbunuh.

Bisakah saya membuat bash make zombie?


Mengapa saya bertanya:

Saya ingin dapat dengan aman membunuh proses anak atau dengan aman kill -9jika itu tidak mati dalam periode waktu tertentu tetapi saya tidak ingin secara tidak sengaja melakukan zap proses yang bukan proses anak saya. Proses zombie biasanya membuatnya sangat mudah dan kondisi ras aman.

PSkocik
sumber
1
Mungkin ide lain ... jika Anda benar-benar ingin melindungi dari membunuh proses di luar, lihat cgroup. Panggilan unshareuntuk membuat namespace PID, sehingga dari dalam pohon proses itu, proses luar terisolasi dan tidak dapat diakses.
orion
Gunakan kontrol pekerjaan (seperti di, di kill -KILL %nmana nnomor pekerjaan, dan sebagainya), alih-alih mencoba mengelak.
Hewan Nominal
Pertanyaan bagus! Pendekatan alternatif untuk "mengapa Anda bertanya," meskipun: sudahkah Anda mempertimbangkan timeoutperintah?
Wildcard

Jawaban:

13

Untuk membuat proses zombie:

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

Ini mengganti shell yang berjalan sleep 1dengan /bin/sleep 10yang tidak akan tahu sleep 1proses dihentikan, sehingga membuat zombie selama 10 detik.


Saya tidak yakin apa yang Anda harapkan dari membunuh proses zombie. Proses zombie sudah mati, Anda tidak bisa membunuhnya.

Sebenarnya, Anda bisa membuat proses zombie menghilang, tetapi dengan membunuh orang tuanya, bukan proses zombie sendiri.

cuonglm
sumber
PID yang dirumah bisa didaur ulang. Inti dari zombie adalah bahwa mereka memesan PID sampai orang tua mengakui kematian anaknya dengan menunggu. Tanpa ini, membunuh seorang pid dapat mengakibatkan korban kecelakaan.
PSkocik
1
Dalam C, Anda dapat memastikan bahwa Anda tidak akan membuat korban yang tidak disengaja ketika Anda membunuh anak Anda karena sampai Anda telah menunggu anak itu, PID anak itu tidak dapat didaur ulang. Saya ingin dapat memiliki jaminan yang sama di shell.
PSkocik
3

Jawabannya tidak begitu menarik:

$ (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>
yaegashi
sumber
Bagaimana ini proses zombie? Itu baru saja berhenti. Juga $BASHPIDadalah $$saya pikir.
Gabor Csardi
$BASHPID adalah tidak sama yang $$. Cobalah kode berikut: echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Anda dapat menemukan informasi lebih lanjut di man bash.
Alex Baranowski