Esta é uma pergunta que foi abordada várias vezes, não apenas aqui, mas também em outros sites da rede de troca de pilhas (por exemplo, como fazer o ssh matar o processo remoto quando eu interrompo o próprio ssh? ). No entanto, não posso fazer nenhuma das soluções funcionar para mim.
Estou executando um comando através do ssh. Sempre que eu sair do ssh, quero que o comando morra também. Este comando é um daemon chamado ktserver que é executado indefinidamente até você pressionar Ctrl-C.
Eu o executo da seguinte maneira: ssh -t compute-0-1 ktserver
e, de fato, quando pressiono Ctrl-C, o processo termina normalmente e a sessão ssh termina.
No entanto, se em vez de pressionar Ctrl-C, eu matar o processo ssh usando o kill
comando (por exemplo, enviando SIGINT ou SIGHUP), o ktserver
processo permanecerá ativo.
Como posso fazer o ktserver
sempre morrer independente de como ssh
é morto?
Edição : Se, em vez de ktserver
eu executar algo completamente diferente, como gedit
, tudo funciona como um encanto (ou seja, gedit morre quando a conexão morre). Portanto, pode haver algo errado com o próprio processo. Por exemplo, eu pensei que poderia estar ignorando SIGHUP ou SIGINT. No entanto, quando executo kill -1 ktserver
ou kill -2 ktserver
, o processo morre conforme o esperado.
EDIT2 : Como aponta Mark Plotnick, o problema está relacionado ao fato de não haver comunicação circulando no canal ssh. Confirmei executando ssh -t <host> read
e matando o processo ssh posteriormente. read
ainda estava vivo e chutando.
kill -9 ktserver
?ssh example.com dd ...
trabalhos foram concluídos até horas depois que assh
conexão morreu devido a problemas de rede. Se você pode alterarktserver
a opção de gerar algo de vez em quando, isso pode ser uma solução alternativa.read
no computador remoto e, depois de matar a conexão ssh,read
não morreu. Infelizmente, não posso mudar o ktserver para produzir nada. Não há solução então?shopt -s huponexit
) Você pode testar se isso funciona para você?Respostas:
Geralmente, quando a conexão ssh morre, o shell também morre. Você pode configurar seu shell para enviar um sinal -1 (SIGHUP) quando terminar para todos os seus filhos.
Para o bash, você pode configurar esta opção através do comando interno shopt . (
shopt -s huponexit
)Para zsh você quer .
setopt
HUP
fonte
ssh -t -t
(observe-t
duas vezes!) O que força a alocação de tty, em vez de apenas pty.Eu descobri que simplesmente usar
-t -t
como argumento parassh
fazer funcionar. Não precisei definirhuponexit
o shell de origem ou remoto.Eu testei isso da seguinte maneira:
Não funciona:
Isso matou a sessão ssh, mas posso ver que o processo de suspensão ainda está em execução no host remoto (
ps -ef | grep sleep
mostra).Funciona:
Isso mata a sessão ssh e o processo de suspensão remota também foi interrompido. Também verifiquei que o sinal enviado ao processo remoto é
SIGINT
se você usar Control- C. Também verifiquei que o SIGKILL (-9) aplicado aossh
processo também matará o processo remoto.EDIT 1:
Isso era verdade para
sleep
... para processos remotos mais teimosos, descobri quessh
lida com ^ C de maneira diferente do SIGINT. Ctrl- Cfuncionou, mas nãokill -INT $pid
funcionouAqui está o que eu finalmente descobri que funcionou para a minha aplicação real (roubando as outras respostas).
Observe o uso aninhado de aspas duplas e aspas simples. Observe que seu processo remoto DEVE responder ao SIGHUP saindo realmente!
fonte
cat
. Por exemplo, #ssh -ttq user@host '{ cmd; cmd; } | cat'
Ctrl-C
nem sempre é equivalente akill -INT $pid
, ver a minha resposta sobre unix.stackexchange.com/questions/377191/... e outro sobre stackoverflow.com/questions/8398845/... para os detalhes ;-)^C
envia SIGINT . Então, qual é a diferença exata se eles não são equivalentes?Se o ssh não propagar sinais, ele recebe o que você esperaria dele?
UPD. (especial para JosephR): é obviamente um erro em questão que resulta de mal-entendidos - "Processo de matança gerado pelo ssh quando o ssh morre". O SSH normalmente não gera processos (às vezes ocorre, mas essa é outra história), mas o SSHD, quando olhamos para o outro lado da conexão. O SSH apenas depende do servidor remoto de abstração pseudo-terminal. É por isso que a única coisa que pode ajudar é a capacidade do terminal de emitir sinais para seus processos conectados. Isso é bastante básico para todos os sistemas semelhantes ao UNIX.
fonte
A solução postada aqui não funcionou para mim, mas como essa pergunta surgiu primeiro, quando eu estava procurando por uma solução para um problema semelhante e também
-t -t
foi mencionado um truque, vou postar uma solução que funcionou para mim para outras pessoas tentarem.Meu comando de longa duração não estava mais sendo executado quando a conexão foi encerrada assim.
fonte