Назад | Перейти на главную страницу

kill -9 не работает

У меня есть сервер с 3 экземплярами Oracle, а файловая система - nfs с netapp. После выключения баз данных один процесс для каждой базы данных долгое время не завершается. Каждое kill -i не работает. Я пробовал связать, запилить команду через ошибку.

И iostat показывает, что сервер netapp выполняет много операций ввода-вывода. Итак, кто-то сказал, что процесс был занят записью данных на удаленный сервер netapp, и до завершения записи он не завершится. Так что нужно было просто подождать, пока все операции ввода-вывода не будут выполнены.

После более длительного ожидания (около 1,5 часов) процессы завершаются.

Итак, мой вопрос: как процесс может игнорировать сигнал уничтожения? Насколько я знаю, если мы убьем -9, он немедленно прекратится. Сталкивались ли вы с такой ситуацией, когда kill -i не убивает процесс сразу?

TEST7-stdby-phxdbnfs11$> ps -ef|grep dbw0
  oracle  1469 25053   0 22:36:53 pts/1       0:00 grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1
TEST7-stdby-phxdbnfs11$> kill -9 1051 
TEST7-stdby-phxdbnfs11$> ps -ef|grep dbw0
  oracle  1493 25053   0 22:37:07 pts/1       0:00 grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1
TEST7-stdby-phxdbnfs11$> kill -9 471
TEST7-stdby-phxdbnfs11$> ps -ef|grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1
  oracle  1495 25053   0 22:37:22 pts/1       0:00 grep dbw0
TEST7-stdby-phxdbnfs11$> ps -ef|grep smon
  oracle  1524 25053   0 22:38:02 pts/1       0:00 grep smon
TEST7-stdby-phxdbnfs11$> ps -ef|grep dbw0
  oracle  1526 25053   0 22:38:06 pts/1       0:00 grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1
TEST7-stdby-phxdbnfs11$> kill -9 1051 471 26795
TEST7-stdby-phxdbnfs11$>  ps -ef|grep dbw0
  oracle  1528 25053   0 22:38:19 pts/1       0:00 grep dbw0
  oracle 26795     1   0 21:55:23 ?           0:00 ora_dbw0_TEST7
  oracle  1051     1   0   Apr 08 ?        3958:51 ora_dbw0_TEST2
  oracle   471     1   0   Apr 08 ?        6391:43 ora_dbw0_TEST1

TEST7-stdby-phxdbnfs11$> truss -p 26795
truss: unanticipated system error: 26795

TEST7-stdby-phxdbnfs11$> pfiles 26795
pfiles: unanticipated system error: 26795

Процесс получит сигнал KILL (все сигналы ведут себя одинаково) только и только тогда, когда он находится в «пользовательском пространстве». Если он находится в пространстве ядра (например, ожидает, пока общий ресурс NFS доставит данные, прочитанные из файла), он не получит сигнал (сигнал будет ждать, пока процесс не вернется в пространство пользователя, он не потеряется).

У большинства NFSD есть несколько вариантов относительно этого, он может вернуться из состояния чтения с ошибкой, если истечет время ожидания. Это приведет к потере данных (как и другой вариант ..), потому что не все программы проверяют все read() полученные результаты.

Процессы не могут игнорировать / отменять сигнал KILL, это только уведомление и дает возможность сохранить любые необходимые данные.

В вопросе не указана клиентская платформа, поэтому я предполагаю Linux.


Видеть соответствующий FAQ на сайте Linux NFS.

Процессы не могут игнорировать SIGKILL, но системные вызовы могут блокировать обработку сигналов.

Есть два флага монтирования для клиентов Linux, которые можно использовать для решения этой проблемы: soft и intr.

soft заставляет NFS в конечном итоге отказываться, когда запрос не выполняется. Если ваше приложение плохо написано для обеспечения устойчивости к сбоям системных вызовов (а многие, многие приложения написаны не так), это может вызвать повреждение данных.

intr пытается сделать системные вызовы NFS более безопасными, чем soft. Тем не менее, все еще возможно получить intr,hard перейти в неубиваемое состояние.