Избегать зомби-процессов из скорлупы? - PullRequest
2 голосов
/ 07 июля 2011

Я пишу пару сценариев оболочки, которые делают несколько вещей:

  1. main.sh запускается под экраном, устанавливает некоторые переменные, затем вызывает: start.sh на переднем плане (нет &)
  2. start.sh запущен, он устанавливает некоторые специфические для Java переменные и запускает процесс Java (снова на переднем плане )
  3. Java работает и работает до тех пор, пока не получит команду 'quit'. (также на переднем плане

    Итак, моё дерево процессов выглядит так:

  - main.sh
    \- start.sh
      \- java

Проблема в том, что иногда Java-программа попадает в причудливое состояние, когда она не соблюдает вашу команду 'quit' и сидит там, весело выполняя свою работу. Я сохранял ID процесса этого Java-процесса в файл PID и отправлял сигналы -STOP (17?) -TERM (15) и KILL (9) этим процессам Java, но, похоже, ничто не может их уничтожить.

Я могу убить -9 процесса 'start.sh', который уничтожает дерево процессов, но оставляет процесс Java в состоянии ужасного несуществующего (зомби), к которому единственным решением является перезагрузка сервера.

Мне было интересно, есть ли у кого-нибудь какие-либо сведения о том, как я могу избежать попадания в такие ситуации, или есть ли какая-то функция Linux / оболочки, которой я пропускаю, которая может помешать этим процессам-зомби. Я также должен добавить, что я не могу изменить код приложения Java, поскольку это частное приложение, и у меня нет доступного исходного кода.

Это работает на Fedora 14 с ядром 2.6.35.13-92.fc14.x86_64.

Заранее спасибо,

Ответы [ 2 ]

4 голосов
/ 07 июля 2011

Зомби мертвы.Если вы хотите, чтобы они отдыхали, ваши родители (main.sh / start.sh) должны wait / waitpid it.

2 голосов
/ 26 ноября 2011

Вы когда-нибудь видели один из тех фильмов, где волшебник машет своей палочкой, и все вокруг него замирают, как статуя, и снова машут ею, и они продолжают, как прежде?Это то, чего хочет kill -STOP, и процесс ничего не может сделать, чтобы защитить себя от него.

Я удивлен, что ваши java-процессы становятся зомби, потому что зомби - это процессы, которые закончили и просто ждут, чтобы сообщить своимродительский процесс, который они закончили.Но родитель должен проверять.Большинство оболочек проверяют регулярно.

Если вы уже уничтожили родительский процесс, то дочерний процесс «меняет родительский» и становится дочерним процессом init (PID 1).Обычно init всегда обращает внимание на процессы, сообщающие, что они закончили.

Если вы kill -STOP родительская оболочка, она не сможет отвечать на дочерние процессы, уведомляя, что они закончили, поэтому дочерний процессстанет зомби, пока вы не перезапустите родителя с kill -CONT.

...