Estou procurando uma maneira de executar um processo, que por si só pode gerar mais subprocessos filhos/netos/etc. Então:
- Ser capaz de enviar um sinal (por exemplo, TERM ou KILL) a todos os descendentes.
- Ser capaz de garantir que, quando o processo principal terminar, todos os descendentes sejam encerrados (seja matando-os ou porque esperamos que todos saíssem voluntariamente).
" todos os descendentes" devem incluir descendentes que usam o mesmo método para criar seu próprio grupo de processos internos. Portanto, seja qual for o método que usarmos, ele deverá suportar o aninhamento, caso contrário, os processos terão uma maneira de escapar da nossa supervisão criando seu próprio conclave.
Embora pareça uma tarefa simples, vários métodos documentados falham de diferentes maneiras sutis.
setsid
deixa descendentes órfãos - só pode esperar pelo processo de nível superior. Também não acho que possa ser aninhado, porque as sessões não podem ser aninhadas.- O Yelp
dumb-init
não pode ser aninhado (sem usar--single-process
). bwrap
pode criar um namespace PID e executar uminit
dentro dele, o que parece estar na metade do caminho, porém não pode esperar até que todos os subprocessos sejam encerrados.- Tentei combinar
dumb-init
combwrap --as-pid-1
, o que parece nos levar um passo adiante, no entanto, a única maneira de enviar um SIGKILL para todo o grupo é mapear outro sinal para KILL usando o recursodumb-init
de--rewrite
. Isso interrompe o aninhamento: mapear um sinal para SIGKILL no exteriordumb-init
apenas matará o innerdumb-init
, deixando outros processos internos em execução. - A execução dos comandos em um contêiner (
docker
oupodman
) atinge esses objetivos. No entanto, é uma solução pesada que requer trabalho extra para configurar e desabilitar outros tipos de isolamento (por exemplo, do sistema de arquivos ou UIDs) e habilitar o aninhamento (DinD etc.).
Algo que eu esqueci?