Я ищу способ прозрачно заморозить (приостановить) процесс, а затем разморозить его позже. Это возможно с SIGSTOP
, но SIGSTOP
вызывает уведомление родителя (возвращаясь из waitpid
), который, например, заставляет bash помещать интерактивные процессы в фоновый режим (проблемы с этим подходом описаны более подробно в этой ссылке).
В cgroup
подсистема есть способ добиться этого записывая файлы в /sys/fs/cgroup/freezer/
, но это применимо только на уровне cgroup, то есть вы можете заморозить только целую группу процессов / потоков за раз. Я полагаю, что это можно было бы обойти, разместив каждый процесс в отдельной контрольной группе, но это кажется довольно хлопотным и, возможно, опасным, поскольку systemd
и другие. уже используют cgroups
для своих целей.
Я довольно близок к тому, чтобы просто написать модуль ядра, который раскрывает базовый freeze_task
API к пользовательскому пространству, но я бы очень хотел этого избежать, если возможно!
Я смог довольно легко заморозить и разморозить один процесс (xeyes), используя следующие инструкции: https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt
Я знаю, что это тот же документ, на который вы ссылались, но я не вижу проблем в том, чтобы сделать это таким образом. Вы можете легко написать сценарий / программу, чтобы автоматизировать все это для вас и заморозить отдельные процессы по желанию.
В моей системе Ubuntu 16.04 / sys / fs / cgroup / freezer уже существует, поэтому я пропустил эту часть.
* Examples of usage :
# mkdir /sys/fs/cgroup/freezer
# mount -t cgroup -ofreezer freezer /sys/fs/cgroup/freezer
# mkdir /sys/fs/cgroup/freezer/0
# echo $some_pid > /sys/fs/cgroup/freezer/0/tasks
to get status of the freezer subsystem :
# cat /sys/fs/cgroup/freezer/0/freezer.state THAWED
to freeze all tasks in the container :
# echo FROZEN > /sys/fs/cgroup/freezer/0/freezer.state
# cat /sys/fs/cgroup/freezer/0/freezer.state FREEZING
# cat /sys/fs/cgroup/freezer/0/freezer.state FROZEN
to unfreeze all tasks in the container :
# echo THAWED > /sys/fs/cgroup/freezer/0/freezer.state
# cat /sys/fs/cgroup/freezer/0/freezer.state THAWED
Понятия не имею, как убрать после. Я не мог удалить 0
каталог. Но я уверен, что выход есть.
Этого достаточно или вам нужно что-то еще?