Я пытаюсь проверить поведение, которое трудно воспроизвести в контролируемой среде.Имитация процесса, застрявшего в системном вызове блокировки
Use case: Linux system; обычно Redhat EL 5 или 6 (мы только начинаем с RHEL 7 и systemd, так что в настоящее время это выходит за рамки).
Бывают ситуации, когда мне нужно перезапустить службу. Сценарий, который мы используем для остановки службы, обычно работает достаточно хорошо; он отправляет SIGTERM в процесс, который предназначен для его обработки; если процесс не обрабатывает SIGTERM в течение таймаута (обычно через пару минут), скрипт отправляет SIGKILL, а затем ждет еще пару минут.
Проблема: в некоторых (редких случаях) процесс не выходит после SIGKILL; обычно это происходит, когда он сильно застревает в системном вызове, возможно, из-за проблемы на уровне ядра (поврежденная файловая система или не работающая файловая система NFS или что-то в равной степени плохое, требующее ручного вмешательства).
Ошибка возникла, когда сценарий не понял, что «старый» процесс фактически не вышел и начал новый процесс, пока старый все еще работает; мы исправляем это с помощью более сильной системы блокировки (так что по крайней мере новый процесс не запускается, если старый работает), но Мне сложно проверить все это на, потому что я не нашел способ имитировать жесткий застрявший процесс.
Итак, вопрос:
Как я могу вручную моделировать процесс, который не выходит при отправке SIGKILL к нему, даже в качестве привилегированного пользователя?
Вы проверили системный журнал и искали процессы в ООН-прерывают или заблокированное состояние, возможно, застряло делать ввод/вывод. – askb
@askb Я не спрашиваю «почему процесс застрял». Я могу справиться с этим, как правило, сбой, с которым ядро не справляется. Я хочу, чтобы мой служебный скрипт был лучше, поэтому я спрашиваю, «как я могу заблокировать процесс в безостановочном syscall», чтобы выполнить мое тестирование. –