2015-06-09 3 views
4

Мне было интересно, есть ли способ поймать сигкилл у убийцы OOM. У меня есть очередь задач, и каждый так часто создается гигантская задача, убитая OOM. Это:python sigkill стратегии лова

catch Exception as ex: 
    # clean up! 

не работает, поскольку SIGKILL не может быть пойман. Итак ... есть ли какая-то стратегия для очистки после SIGKILL? Могу ли я развиваться и наблюдать за процессом ребенка? Если это так, любые ресурсы, открытые дочерним процессом, должны быть заранее известны родителям? Или я мог просто сделать какую-то версию

ps -ef | grep <child pid> | xargs kill -9 (you get the idea...) 

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

Наконец, это достаточно просто сделать:

kill -9 <process id> 

, чтобы проверить эту точную ситуацию?

Большое спасибо!

ответ

8

SIGKILL по самой своей природе не может быть в ловушке.

http://en.wikipedia.org/wiki/Unix_signal#SIGKILL См:

SIGKILL

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

Лучшее, что нужно сделать, это в следующий раз, когда ваш процесс запустится, ищите все, что нужно очистить.

И да, kill -9 <pid> отправит SIGKILL в процесс. (Если быть точным, он посылает 9-й сигнал - просто случается, что SIGKILL имеет номер 9 почти в каждой системе. В качестве альтернативы вы можете написать kill -KILL <pid>, что позволяет вам указывать сигнал по имени, а не по номеру переносным способом.)

+0

Есть ли какая-либо передовая практика или общепринятая мудрость о том, как очистить? Если у меня есть 10 вещей, открывающих подпроцесс ... должен ли я искать процесс с родительским id == 1 и принудительно убивать их? Я немного удивлен, что нет общего способа сделать это ... но я думаю, если это (должно быть) довольно необычное, все придумывают свои собственные? – Hoopes

+0

Если у вас есть куча подпроцессов, у них должен быть механизм контроля других процессов, если они будут убиты. –

+0

FWIW, я использовал отличную библиотеку psutil, чтобы сделать именно это - очиститься при следующем запуске процесса, выполнив поиск ожидаемых имен процессов с ppid 1, принадлежащих пользователю процесса. – Hoopes

1

Убийца Linux OOM работает, отправив SIGKILL.

Чтобы убить выбранный процесс, убийца OOM передает сигнал SIGKILL.

убийство -9 < - Работает

Смежные вопросы