Для сценариев тестирования на катастрофы в серверной среде мы ищем простой способ перевести процесс в состояние D (непрерывный спящий режим).
Есть ли простые способы? Пример C-кода будет плюсом :)
Редактировать - первый ответ является полукорректным, поскольку показано, что процесс находится в состоянии D, но он все еще получает сигналы и может быть убит
Ответы:
У меня была та же проблема, и я решил ее, создав модуль ядра, который застрял в D-состоянии.
Поскольку у меня нет никакого опыта в модулях, я взял код из этого турориала с некоторыми модификациями, найденными где-то раньше .
В результате получается устройство в / dev / memory, которое застревает при чтении, но может быть активировано при записи на него (для этого требуется две записи, я не знаю почему, но мне все равно).
Чтобы использовать это просто:
Чтобы разблокировать, из другого терминала:
Makefile:
Код для memory.c:
источник
С https://blogs.oracle.com/ksplice/entry/disown_zombie_children_and_the
Процесс помещается в непрерывный сон,
(STAT D)
когда ему нужно что-то ждать (обычно ввод / вывод), и он не должен обрабатывать сигналы во время ожидания. Это означает, что вы не можете этогоkill
сделать, потому что все, что делает kill - это посылает ему сигналы. Это может произойти в реальном мире, если вы отключите сервер NFS, когда другие машины имеют к нему открытые сетевые подключения.Мы можем создавать наши собственные непрерывные процессы ограниченной продолжительности, используя преимущества
vfork
системного вызова.vfork
Это похоже на тоfork
, за исключением того, что адресное пространство не копируется из родительского в дочерний, в ожидании,exec
которое просто выбросит скопированные данные. Нам удобно, когда вы,vfork
родитель, непрерывно (в порядкеwait_on_completion
) ждете ребенкаexec
илиexit
:Мы видим ребенка (
PID 1973, PPID 1972
) вPID 1972, PPID 13291
непрерывном сне, а родителя ( - оболочку) в непрерывном сне, пока он ждет 60 секунд на ребенке.Одна из замечательных (вредных?) Вещей в этом сценарии заключается в том, что процессы в непрерывном сне вносят вклад в среднюю нагрузку на машину. Таким образом, вы можете запустить этот сценарий 100 раз, чтобы временно увеличить нагрузку на машину в среднем на 100, как сообщает
uptime
.источник
kill
: /По сути, вы не можете. Прочтите эту статью под названием: TASK_KILLABLE: Новое состояние процесса в Linux .
выдержкаЭто SO Q & A под названием: Что такое непрерывный процесс? и объясняет это.
Я обнаружил это в этой очень интересной книге под названием: Интерфейс программирования Linux: Руководство по системному программированию для Linux и UNIX .
источник
TASK_KILLABLE
состояния.