Se eu fizer ctrl- ce ctrl- dmatar procs em painéis e depois sair do tmux, todos os processos filhos morrerão.
Mas se eu fizer isso:
ctrl+ bseguido por shift+%
então selecione Y para matar a janela, então os procs permanecem vivos. Alguma idéia de como garantir que os procs sejam mortos quando a janela for morta?
Ctrl+ cvs
kill-window
Com Ctrl+ cvocê normalmente (quando
stty -a
mostraintr = ^C
) envia SIGINT para processos no grupo de processos em primeiro plano . Você parece assumir que qualquer processo que obtém SIGINT sai (é morto), mas em geral pode não ser.Você mencionou Ctrl+ d, então provavelmente há um shell interativo entre o servidor tmux e o processo que você deseja encerrar. Neste caso, o SIGINT é enviado para o processo, não para o shell; mas mesmo que o shell o pegasse, ele não sairia. (Não estou dizendo que é sempre assim; estou dizendo que corresponde à sua descrição).
Então, parece que depois que o processo termina em Ctrl+ c, você pressiona Ctrl+ dpara sair do shell.
Quando você mata uma janela no tmux, os respectivos pseudoterminais são fechados e os processos que os utilizam como seus terminais de controle recebem SIGHUP. Esse processo pode enviar SIGHUP para seus filhos (para um shell, veja esta resposta ). Um processo pode ignorar o sinal (consulte
nohup
). Mesmo que ignore o sinal, pode (ou não) morrer mais tarde se tentar usar um pseudo-terminal que não existe mais.Então resumindo:
Enviando SIGINTs
Um processo pode ignorar SIGINT. Se Ctrl+ cfizer o que você deseja para os processos com os quais está lidando, talvez seja suficiente enviar SIGINTs para eles antes de matar a janela e enviar SIGHUPs; como se você apertasse Ctrl+ cem cada painel.
O comando a seguir lista os processos (filhos imediatos do servidor tmux) em painéis na janela atual, obtém os respectivos grupos de processos em primeiro plano e envia SIGINT para cada um:
O problema é que esse mesmo pipeline também receberá SIGINT e pode terminar prematuramente. Para lidar com isso
-t
para especificar uma janela,ou execute o pipeline em segundo plano:
ou faça o comando ignorar o sinal:
Eu acho que a abordagem é propensa à condição de corrida; as coisas podem mudar entre
ps
ekill
. Uma alternativa melhor (?) é enviar Ctrl+ cpara cada painel:Gancho
Use este gancho para fazer o tmux enviar Ctrl+ cpara cada painel em uma janela que está prestes a ser
kill-window
editada:Isso parece horrível porque existem três níveis de citação, ainda parece funcionar em meus testes (ainda não testei completamente). O objetivo de
##
é adiar a expansão de#{pane_id}
. O ponto é#{window_id}
que precisa ser expandido quandorun-shell
funciona, mas#{pane_id}
deve sobreviver e só ser expandido quandolist-panes
gerar sua saída.Observe as tampas do gancho,
kill-window
mas nãokill-pane
,kill-session
oukill-server
. Também nãokill-window
é apenas repetido várias vezes, então o gancho certamente não cobrirá todos os casos em que um painel é destruído à força. E há também e comandos.kill-pane
before-kill-pane
respawn-pane -k
respawn-window -k
E se não for suficiente?
Um processo não pode terminar no SIGINT. Como ponto de partida, você pode tentar obter uma lista de PIDs (e/ou PGIDs
tmux list-panes -F "#{pane_pid}"
) para os quais gostaria de enviar SIGTERM (ou mesmo SIGKILL). O principal problema com essa abordagem geral é que é possível gerar um processo e quebrar completamente sua conexão com seus ancestrais e tty.Portanto, em geral, você pode não conseguir rastrear todos os processos originados da janela tmux fornecida.
Você não está dando informações suficientes.
C-b %
divide a janela, não mata nada, então você deve ter alterado a ligação de teclas. A que você tem isso vinculado? Ou você quer dizerC-b &
?Matar um painel fechará o pty e o kernel enviará a qualquer processo que tenha o pty como terminal de controle um SIGHUP que deve fazê-los sair, a menos que o ignorem.
O que exatamente você está executando no painel? Os processos não saem ou se tornam zumbis?
Também seria útil saber qual versão do tmux você está usando.