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

Заморозить и разморозить процессы прозрачно?

Я ищу способ прозрачно заморозить (приостановить) процесс, а затем разморозить его позже. Это возможно с 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 каталог. Но я уверен, что выход есть.

Этого достаточно или вам нужно что-то еще?