C'est une question qui a été abordée plusieurs fois, non seulement ici, mais aussi dans d'autres sites du réseau d'échange de pile (par exemple, comment faire ssh pour tuer le processus distant lorsque j'interromps ssh lui-même? ). Cependant, je ne peux faire fonctionner aucune des solutions pour moi.
J'exécute une commande via ssh. Chaque fois que je quitte ssh, je veux que la commande meure également. Cette commande est un démon appelé ktserver qui s'exécute indéfiniment jusqu'à ce que vous appuyiez sur Ctrl-C.
Je l'exécute comme suit: ssh -t compute-0-1 ktserver
et, en effet, lorsque j'appuie sur Ctrl-C, le processus se termine avec élégance et la session ssh se termine.
Cependant, si au lieu d'appuyer sur Ctrl-C, je tue le processus ssh à l'aide de la kill
commande (par exemple, l'envoi de SIGINT ou SIGHUP), le ktserver
processus reste vivant.
Comment puis-je rendre le ktserver
toujours indépendant sur la façon dont ssh
est tué?
EDIT : Si, au lieu de ktserver
lancer quelque chose de complètement différent, comme gedit
, tout fonctionne comme un charme (c'est-à-dire que gedit meurt lorsque la connexion s'éteint). Par conséquent, il peut y avoir un problème avec le processus lui-même. Par exemple, j'ai pensé qu'il pourrait ignorer SIGHUP ou SIGINT. Cependant, lorsque j'exécute kill -1 ktserver
ou kill -2 ktserver
, le processus se termine comme prévu.
EDIT2 : Comme le souligne Mark Plotnick, le problème est lié au fait qu'aucune communication ne circule sur le canal ssh. J'ai confirmé en exécutant ssh -t <host> read
et en tuant le processus ssh par la suite. read
était toujours en vie et donnait des coups de pied.
kill -9 ktserver
?ssh example.com dd ...
travaux ont été exécutés jusqu'à la fin des heures, même après lassh
connexion, en raison de problèmes de réseau. Si vous pouvez modifierktserver
pour prendre une option pour sortir quelque chose de temps en temps, cela peut être une solution de contournement.read
sur l'ordinateur distant, et après avoir tué la connexion ssh , je ne suisread
pas mort. Malheureusement, je ne peux pas changer ktserver pour afficher quoi que ce soit. Il n'y a donc pas de solution?shopt -s huponexit
). Pouvez-vous tester si cela fonctionne pour vous?Réponses:
Habituellement, lorsque la connexion ssh meurt, le shell meurt également. Vous pouvez configurer votre shell pour envoyer un signal -1 (SIGHUP) lorsqu'il se termine à tous ses enfants.
Pour bash, vous pouvez configurer cette option via la commande intégrée shopt . (
shopt -s huponexit
).Pour zsh vous voulez .
setopt
HUP
la source
ssh -t -t
, (remarquez-t
deux fois!), Ce qui force l'allocation de tty, plutôt que juste pty.J'ai trouvé cela simplement en utilisant
-t -t
comme argument pour lessh
faire fonctionner. Je n'ai pas eu à définirhuponexit
le shell d'origine ou distant.J'ai testé cela comme suit:
Ne fonctionne pas:
Cela a tué la session ssh, mais je peux voir que le processus de veille est toujours en cours d'exécution sur l'hôte distant (le
ps -ef | grep sleep
montre).Fonctionne:
Cela tue la session ssh et le processus de veille à distance a également été tué. J'ai également vérifié que le signal envoyé au processus distant est
SIGINT
si vous utilisez Control- C. J'ai également vérifié que SIGKILL (-9) appliqué aussh
processus tuera également le processus distant.EDIT 1:
C'était vrai pour
sleep
... pour les processus à distance plus tenaces, je trouve que lesssh
poignées ^ C différemment que SIGINT. Ctrl- a Cfonctionné, maiskill -INT $pid
n'a pas fonctionnéVoici ce que j'ai finalement trouvé qui a fonctionné pour ma candidature réelle (en volant les autres réponses).
Notez l'utilisation imbriquée des guillemets doubles et des guillemets simples. Notez que votre processus distant DOIT répondre à SIGHUP en quittant réellement!
la source
cat
. Par exemple,ssh -ttq user@host '{ cmd; cmd; } | cat'
Ctrl-C
n'est PAS toujours équivalent àkill -INT $pid
, voir ma réponse sur unix.stackexchange.com/questions/377191/… et une autre sur stackoverflow.com/questions/8398845/… pour les détails sanglants ;-)^C
envoie SIGINT . Quelle est donc la différence exacte si elles ne sont pas équivalentes?Si ssh ne propage pas les signaux qu'il reçoit, qu'en attendez-vous?
UPD. (spécial pour JosephR): c'est évidemment une erreur en question elle-même qui découle d'un malentendu - "Kill process engendré par ssh lorsque ssh meurt". SSH ne génère généralement pas de processus (parfois, mais c'est une autre histoire), SSHD le fait à la place, lorsque nous examinons l'autre côté de la connexion. SSH s'appuie simplement sur un serveur distant d'abstraction pseudo-terminal. C'est pourquoi la seule chose qui peut être utile est la capacité du terminal à émettre des signaux vers ses processus attachés. C'est un peu très basique pour chaque système de type UNIX.
la source
La solution publiée ici n'a pas fonctionné pour moi, mais comme cette question est apparue en premier lorsque je cherchais une solution à un problème similaire et
-t -t
qu'une astuce a également été mentionnée ici, je publierai une solution qui a fonctionné pour moi pour que d'autres puissent l'essayer.Ma commande longue ne fonctionnait plus lorsque la connexion a été interrompue comme ceci.
la source