Зомбі в баш


11

Баш, здається, не створює зомбі. Схоже, що процеси одразу ж пожинають, коли їх вбивають.

Чи можу я змусити баш зробити зомбі?


Чому я прошу:

Я хотів би мати можливість безпечно вбити дитячий процес або безпечно kill -9його, якщо він не загине протягом певного проміжку часу, але я не хочу випадково зачинити процес, який не є моїм дочірнім процесом. Зомбі-процеси зазвичай роблять це дуже легко та безпечним для перегонів.


1
Можливо, інша ідея ... якщо ви дійсно хочете захиститись від вбивства зовнішніх процесів, перегляньте групи. Зателефонуйте unshareстворити простір імен PID, щоб зсередини цього дерева процесів зовнішні процеси були ізольованими та недоступними.
Оріон

Використовуйте контроль за роботою (як у, kill -KILL %nде nномер роботи тощо), а не намагатися його обійти.
Номінальна тварина

Чудове запитання! Альтернативний підхід до "чому ти питаєш", хоча: ти розглядав timeoutкоманду?
Wildcard

Відповіді:


13

Щоб зробити процес зомбі:

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

Це замінить оболонку, яка працює sleep 1з /bin/sleep 10цим, не буде знати, що sleep 1процес закінчився, тому створивши зомбі протягом 10 секунд.


Я не впевнений, що ви очікуєте від вбивства зомбі. Процес зомбі вже був мертвим, його не можна вбити.

Насправді ви можете змусити процесів зомбі зникнути, але, вбивши його батьків, а не самих процесів зомбі.


Повторно отримані PID піддаються переробці. Сенс зомбі полягає в тому, що вони резервують PID, поки батько не визнає смерть своєї дитини, чекаючи на неї. Без цього вбивство піда може призвести до випадкової жертви.
PSkocik

1
У C ви можете бути впевнені, що не зробите випадкової жертви, коли вбите свою дитину, оскільки поки ви не дочекалися цієї дитини, PID цієї дитини не може бути перероблений. Я хотів би мати таку ж гарантію в оболонці.
PSkocik

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

$BASHPID це НЕ те ж саме , що $$. Спробуйте наступний код: echo $$ $BASHPID ;echo $(echo $$ $BASHPID). Ви можете знайти більше інформації в man bash.
Олексій Барановський
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.