Si votre tâche est déjà lancé, il est trop tard *
pour envisager des solutions alternatives insérer une couche supplémentaire entre votre ssh
session et le shell en cours d' exécution de la commande, comme screen
, tmux
, byobu
, nohup
et les goûts.
Si votre soutien de processus à placer en arrière - plan et ne se bloque pas particulièrement quand stdout
et stderr
sont unwritable / fermé, vous pouvez le mettre en arrière - plan avant de vous connecter avec ControlZet bg
puis le détacher de votre coquille avec le disown
builtin.
par exemple:
$ ssh localhost
You have new mail.
Last login: Fri Jun 6 11:26:56 2014
$ /bin/sleep 3600
^Z[1] + Stopped /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] + Running /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864 1 0 21:12 ? 00:00:00 /bin/sleep 3600
jlliagre 13056 12477 0 21:13 pts/18 00:00:00 grep sleep
$
*
Comme l'a commenté Bob, il existe en fait plusieurs façons de pirater une session tty sous Linux. vide, retty , injcode et neercs . Le plus avancé semble être reptyr mais vous pourriez avoir besoin des privilèges root pour permettre à ptrace de pirater votre processus.
disown
commande. Il a renvoyé: bash: avertissement: suppression du travail 1 arrêté avec le groupe de processus 24876. Mon travail est maintenant répertoriéps -all
mais semble ne pas fonctionner (l'utilisation du processeur est de 0%)disown
commandebg
commande était requise dans la première partie de ma réponse. Édité.kill -CONT
qui fait à peu près la même chose que bg.Une solution consiste à utiliser l' écran GNU . Vous pouvez démarrer
screen
, exécuter votre commande, puis vous détacherC-a d
. Plus tard, pour vous reconnecter, faitesscreen -r
, et vous êtes de retour dans votre session précédente.La gestion des fenêtres présente également d'autres avantages (vous pouvez donc passer à d'autres shells pendant que votre commande est en cours d'exécution, sans avoir besoin d'une nouvelle connexion SSH), et elle permet à votre commande de rester au premier plan, que ce soit dans la session en cours ou plus tard.
Modifier: comme indiqué dans les commentaires, cela ne fonctionnera que si vous vous souvenez de commencer
screen
avant d'exécuter la commande. Si la commande est déjà en cours d'exécution, vous aurez besoin de la solution de @ jlliagre.la source
tmux
est un autre programme commescreen
celui-ci qui vous permet d'avoir une session à distance qui n'est pas liée à votre connexion SSH actuelle.screen
.screen
outmux
.)L'une des façons "standard" de le faire est d'utiliser la
nohup
commande incluse danscoreutils
, comme ceci:Mais la commande redirigera la sortie (
STDOUT
&STDERR
AFAIK) du programme dans un fichiernohup.out
, ce qui le rendra quelquefois ennuyeux parfois (comme générer un énorme fichier journal), donc vous voudrez peut-être faire votre propre redirection, ou la rediriger vers / dev / null si tu veux.la source
nohup
Peut en fait être utilisé pour cela. Suspendez simplement le processus en cours et envoyez-le en arrière-plan (Ctrl
+Z
et exécutezbg
), puis vous pourrez émettrenohup %1
.En plus de
nohup
vous pouvez lancer le processus en arrière-plan en utilisant "&" et sous-shell:Suffixez la commande avec & et enveloppez-la entre parenthèses
Disons que votre processus gagne le pid 1922:
Regardez qu'il n'est pas attaché au processus shell 11473 qui était son parent d'origine. Donc, si vous quittez ou tuez le shell actuel (11473), le processus 11922 continue de fonctionner et il sera déconnecté des pts.
Essayez de quitter le shell et entrez dans un nouveau shell. Même si ce shell est connecté aux mêmes points, vous pouvez maintenant voir le processus sans point:
Je ne sais pas comment c'est appelé ou documenté dans Posix, mais j'utilise cette méthode depuis 1990 dans bsh, ksh et maintenant dans bash.
Enfin, vous pouvez utiliser la
bg
commande shell intégrée:Lancez simplement votre programme et si vous décidez de le suspendre ou si vous prévoyez de le garder en arrière-plan, tapez CTRL + Z:
Maintenant, laissez-le continuer à fonctionner en arrière-plan:
Si vous regardez les infos du processus, il a encore un processus parent:
Alors, quittez le processus en cours. Le processus en cours d'exécution en arrière-plan est détaché de son parent d'origine et continue de s'exécuter en arrière-plan:
Connectez-vous à nouveau et consultez les informations sur le processus:
la source