Congela e descongela processos de forma transparente?

3

Estou procurando uma maneira de transparentemente congelar (pausar) um processo e descongelá-lo depois. Isso é possível com SIGSTOP , mas SIGSTOP faz com que o pai seja notificado (retornando de waitpid ), o que, por exemplo, faz com que o bash coloque os processos interativos em segundo plano (os problemas com essa abordagem são descritos em mais detalhes neste link ).

O cgroup subsystem tem uma maneira de realizar isso escrevendo em arquivos em /sys/fs/cgroup/freezer/ , mas isso se aplica apenas ao nível do cgroup - ou seja, você só pode congelar um grupo inteiro de processos / threads por vez. Eu suponho que alguém poderia contornar isso arranjando para colocar cada processo em seu próprio cgroup, mas isso parece um pouco complicado, e possivelmente perigoso desde systemd et al. já estão usando cgroups para seus próprios propósitos.

Estou muito perto de escrever um módulo do kernel que expõe a API freeze_task subjacente ao userspace, mas eu realmente gostaria de evitar fazer isso se possível!

    
por Brendan Dolan-Gavitt 14.08.2016 / 17:26

1 resposta

4

Consegui congelar e descongelar um único processo (xeyes) com bastante facilidade usando estas instruções: link

Eu sei que é o mesmo documento que você vinculou, mas não vejo problema em fazer isso dessa maneira. Você poderia facilmente escrever um script / programa para automatizar tudo isso para você e congelar processos individuais conforme desejado.

No meu sistema Ubuntu 16.04, o / sys / fs / cgroup / freezer já existia, então eu pulei essa parte.

* 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

Eu não tenho ideia de como limpar depois. Não consegui eliminar o diretório 0 . Mas tenho certeza que há um jeito.

Isso é bom o suficiente ou há algo mais que você precisa?

    
por 14.08.2016 / 21:07

Tags