Почему Процесс/программа становится зомби?

VPN может решить это, да.

А именно, Вам будет нужна VPN, которая позволяет перенаправление портов. У меня только есть опыт с Mullvad, и они делают это, но я уверен, что много других VPNs также обеспечивают это.

С большинством сервисов Вы, вероятно, не можете ожидать передавать произвольные порты (22 для ssh, например), таким образом, необходимо было бы использовать некоторый "случайный" порт высокого числа. Но конфигурирование ssh/ftp для этого должно быть очень простым.

13
21.12.2013, 00:48
2 ответа

enter image description here

Как фактический зомби не может быть уничтожен процесс-зомби, потому что это уже мертво.

Как это происходит

Когда в Linux/Unix процесс умирает/заканчивает, вся информация от процесса удалена из системной памяти, только дескриптор процесса остается. Процесс входит в состояние Z (зомби). Его родительский процесс получает сигнал от ядра: SIGCHLD, это означает, что один из его выходов дочерних процессов, прерван или возобновляется, будучи прерванным (в нашем случае, из которого он просто выходит).

Родительский процесс теперь должен выполниться wait() syscall для чтения статуса выхода и другой информации от его дочернего процесса. Затем дескриптор удален из памяти, и процесс больше не является зомби.

Если родительский процесс никогда не звонит wait() syscall, дескриптор процесса-зомби остается в памяти и ест мозги. Обычно Вы не видите процессы-зомби, потому что процедура выше взятия меньше времени.

Рассвет мертвецов

Каждому дескриптору процесса нужен очень небольшой объем памяти, таким образом, несколько зомби не очень опасны (как в реальной жизни). Одна проблема состоит в том, что каждый процесс-зомби сохраняет его идентификатор процесса, и операционная система Linux/Unix имеет ограниченное количество pid. Если неправильно запрограммированное программное обеспечение генерирует много процессов-зомби, это может произойти, который обрабатывает, не может больше запускаться, потому что больше идентификатора процесса не доступно.

Так, если они находятся в огромных группах, они очень опасны (как во многих фильмах, продемонстрирован очень хорошо),

Как мы можем защитить нас от орды зомби?

Выстрел в голове работал бы, но я не знаю команду для того (SIGKILL не будет работать, потому что процесс уже мертв).

Ну, можно ли отправить SIGCHLD через уничтожение к родительскому процессу, но когда это игнорирует этот сигнал, что затем? Ваша единственная опция состоит в том, чтобы уничтожить родительский процесс и что процесс init "принимает" зомби. Init периодически звонит wait() syscall для чистки его детей зомби.

В Вашем случае

В Вашем случае необходимо отправить SIGCHLD в процесс crond:

root@host:~# strace -p $(pgrep cron)
Process 1180 attached - interrupt to quit

Затем от другого терминала:

root@host:~$ kill -17 $(pgrep cron)

Вывод:

restart_syscall(<... resuming interrupted call ...>) = ? ERESTART_RESTARTBLOCK (To be restarted)
--- SIGCHLD (Child exited) @ 0 (0) ---
wait4(-1, 0x7fff51be39dc, WNOHANG, NULL) = -1 ECHILD (No child processes) <-- Here it happens
rt_sigreturn(0xffffffffffffffff)        = -1 EINTR (Interrupted system call)
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=1892, ...}) = 0
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {0x403170, [CHLD], SA_RESTORER|SA_RESTART, 0x7fd6a7e9d4a0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({42, 0}, ^C <unfinished ...>
Process 1180 detached

Вы видите wait4() syscall возвращает-1 ECHILD, что означает, что никакой дочерний процесс не там. Таким образом, заключение: крон реагирует на SIGCHLD syscall и не должен вызывать апокалипсис.

21
27.01.2020, 19:53
  • 1
    Что, никакие крикетные биты и линия в секунду? –  Alexios 20.12.2013, 12:37

Если родительский поток будет уничтожен то перед его дочерним потоком весь дочерний поток станет процессами-зомби.

-3
27.01.2020, 19:53
  • 1
    Не верный, они будут просто повторно порождены. Процессы-зомби не имели waitpid названным. –  Chris Down 20.12.2013, 10:15
  • 2
    Возможно, он говорил о родительских и дочерних процессах; дочерний процесс становится "висячей строкой", когда ее родитель "умирает". –  Barun 20.12.2013, 14:39

Теги

Похожие вопросы