Skip to Content
 Русский Русский    English English   

 

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?)":

Неубиваемый по kill -9 процесс Asterisk. Ошибка Unable to connect to remote asterisk (does /var/run/asterisk/asterisk.ctl exist?)

В папке /var/run/asterisk:

FreeBSD 8.3. Неубиваемый по kill -9 процесс Asterisk. Файлы в папке /var/run/asterisk

При попытке остановить по kill -9 результат тот же - процесс продолжает отображаться в выводе команды ps:

FreeBSD 8.3. Неубиваемый по kill -9 процесс Asterisk. Вывод команды 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":

Логи Asterisk. Ошибка tcptls.c: Unable to bind http server to 1.1.1.1:8088: Address already in use

Вывод команды sockstat и lsof показывает занятые процессом asterisk сокеты:

Неубиваемый по kill -9 процесс Asterisk. Вывод команды sockstat показывает занятые процессом asterisk сокеты

Неубиваемый по kill -9 процесс Asterisk. Вывод команды lsof показывает занятые процессом asterisk сокеты

Процесс имеет ppid равный 1, то есть родительский процесс init:

Неубиваемый по kill -9 процесс Asterisk. Процесс имеет ppid равный 1, то есть родительский процесс init

Команда truss не отображает ни одного системного вызова.

Попытки завершить процесс с другими сигналами команды kill, в том числе SIGCONT, также приводят к неудаче. Это означает, что процесс в данный момент не может быть помещен в очередь выполнения, потому что только те процессы, которые пригодны для запуска, могут получать сигналы. Освободить зависшие ресурсы, занятые процессом, штатными средствами FreeBSD нельзя. В данном случае помогает только перезагрузка сервера.

Наиболее распространенные причины, при которых невозможно завершить процесс, в том числе по SIGKILL:

1. Процесс висит со статусом D (флаг D в выводе команды ps). Это означает, что имеется аппаратная проблема с диском или контроллером (драйвером) или сетевая проблема, если используется NFS.

2. Процесс был приостановлен. В выводе команды ps отображается статус T (sTopped). В данном случае можно попытаться послать SIGCONT процессу (kill -19).

3. Процесс со статусом Z. Это дочерний процесс, который завершил своё выполнение, но родительский процесс не смог получить его код завершения. Такой процесс ещё присутствует в списке процессов операционной системы. Он не использует системные ресурсы, не занимает память, но блокирует записи в таблице процессов, размер которой ограничен для каждого пользователя и системы в целом.  Такие "мертвые процессы" называют зомби.

 

Ваша оценка: Нет Средняя: 5 (26 голосов)