Estou executando a máquina virtual QEMU no -daemonize
modo e, em seguida, gero um processo arbitrário de primeiro plano (possivelmente interativo) destinado a interagir com a instância QEMU. Em geral, quando o processo em primeiro plano é concluído, faço uma limpeza da instância QEMU via pidfile:
qemu-system ... -pidfile ./qemu.pid -daemonize
/my/custom/interactive/process
pkill -F ./qemu.pid
No entanto, em alguns cenários, o QEMU pode sair independentemente e meu processo em primeiro plano continua a ser executado. Mas eu gostaria de pará-lo no caso. Portanto, o comportamento do meu processo interativo personalizado deve ser assim:
tail -f --pid=./qemu.pid /dev/null
Como posso fazer isso bem? Talvez haja algum tipo de wrapper de tempo limite, para que eu possa executar algo como:
trackpid ./qemu.pid /my/custom/interactive/process
Você pode pesquisar o desaparecimento do processo qemu e encerrar mais cedo quando isso acontecer. Este é um código testado rapidamente e notavelmente não testado com
qemu-system
.Também tem bastante. Você pode remover as
#DEBUG
linhas, mas se estiver interessado em ver como tudo se encaixa, descomente-as e compare a saída do programa com o código.Finalmente acabei com o seguinte código:
Script em chaves é na verdade um monitor pidfile rodando em segundo plano. Uma vez que o pid se foi, monitore o grupo de processos atual. Eu usei
kill -INT 0
porque dá resultado mais confiável e limpo para mim.Outras opções eram:
kill -- 0
(matar com sinal TERM, não finaliza corretamente o processo interativo)kill -INT $$
(mata apenas o processo de shell, não encerra corretamente o processo interativo)kill -- -$$
(kill process group denotado por pid do shell, nem sempre funciona corretamente, suponho devido à invocação comsudo
atuação como líder do grupo de processos)pkill -P $$
(matar apenas o processo filho, na verdade funciona, mas eu preferi usar o shell embutido e confiar no comportamento de processamento Ctrl-C).Outro ponto é que, se meu processo interativo for concluído por conta própria, terei que matar o processo do monitor para evitar mais inferências na saída e limpeza do script.