FreeBSD 8.3. Неубиваемый по kill -9 процесс Asterisk
FreeBSD 8.3. Неубиваемый по kill -9 процесс Asterisk
Когда нет возможности перезагрузить сервер, проблема зависшего процесса может превратиться в головную боль. И таким процессом стал Asterisk.
При остановке Asterisk 1.8.12.0 появилась ошибка "Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)":
В папке /var/run/asterisk:
При попытке остановить по kill -9 результат тот же - процесс продолжает отображаться в выводе команды ps:
Статус этого процесса - Ts, где T означает то, что процесс находится в состоянии STOP. В теории, в состояние STOP процесс можно перевести, отправив ему сигнал SIGSTOP. При этом выполнение процесса будет приостановлено и возобновится после получения сигнала SIGCONT. В данном случае перевод процесса в состояние STOP вероятно вызван внутренним программным сбоем.
Новый же процесс asterisk не работает из-за занятых сокетов. В логах asterisk появляются ошибки:
# more /var/log/asterisk/messages
"ERROR[8466] tcptls.c: Unable to bind http server to 1.1.1.1:8088: Address already in use
ERROR[8466] tcptls.c: Unable to bind AMI server to 1.1.1.1:5038: Address already in use":
Вывод команды sockstat и lsof показывает занятые процессом asterisk сокеты:
Процесс имеет ppid равный 1, то есть родительский процесс init:
Команда truss не отображает ни одного системного вызова.
Попытки завершить процесс с другими сигналами команды kill, в том числе SIGCONT, также приводят к неудаче. Это означает, что процесс в данный момент не может быть помещен в очередь выполнения, потому что только те процессы, которые пригодны для запуска, могут получать сигналы. Освободить зависшие ресурсы, занятые процессом, штатными средствами FreeBSD нельзя. В данном случае помогает только перезагрузка сервера.
Наиболее распространенные причины, при которых невозможно завершить процесс, в том числе по SIGKILL:
1. Процесс висит со статусом D (флаг D в выводе команды ps). Это означает, что имеется аппаратная проблема с диском или контроллером (драйвером) или сетевая проблема, если используется NFS.
2. Процесс был приостановлен. В выводе команды ps отображается статус T (sTopped). В данном случае можно попытаться послать SIGCONT процессу (kill -19).
3. Процесс со статусом Z. Это дочерний процесс, который завершил своё выполнение, но родительский процесс не смог получить его код завершения. Такой процесс ещё присутствует в списке процессов операционной системы. Он не использует системные ресурсы, не занимает память, но блокирует записи в таблице процессов, размер которой ограничен для каждого пользователя и системы в целом. Такие "мертвые процессы" называют зомби.
Нажимая кнопку «Сохранить», я подтверждаю свою дееспособность, согласие на получение информации от NetK, согласие на обработку персональных данных в соответствии с Политикой конфиденциальности и Пользовательским соглашением.