La meilleure méthode consiste à démarrer le processus dans un multiplexeur de terminal. Sinon, vous pouvez empêcher le processus de recevoir le signal HUP.
Un multiplexeur de terminaux fournit des terminaux "virtuels" qui fonctionnent indépendamment du "vrai" terminal (en fait, tous les terminaux sont aujourd'hui "virtuels" mais c'est un autre sujet pour un autre jour). Le terminal virtuel continuera à fonctionner même si votre terminal réel est fermé avec votre session SSH.
Tous les processus démarrés à partir du terminal virtuel continueront à s'exécuter avec ce terminal virtuel. Lorsque vous vous reconnectez au serveur, vous pouvez vous reconnecter au terminal virtuel et tout se passera comme si rien ne s'était passé, à l'exception du temps écoulé.
Screen et tmux sont deux multiplexeurs populaires .
L'écran a une courbe d'apprentissage abrupte. Voici un bon tutoriel avec des diagrammes expliquant le concept: http://www.ibm.com/developerworks/aix/library/au-gnu_screen/
Le signal HUP (ou SIGHUP) est envoyé par le terminal à tous ses processus enfants lorsque le terminal est fermé. L’action commune à la réception de SIGHUP consiste à terminer. Ainsi, lorsque votre session ssh sera déconnectée, tous vos processus se termineront. Pour éviter cela, vous pouvez faire en sorte que vos processus ne reçoivent pas SIGHUP.
Deux méthodes faciles à suivre sont nohup
et disown
.
Pour plus d'informations sur comment nohup
et comment disown
travailler, lisez cette question et sa réponse: https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and
Remarque: bien que les processus continuent à s'exécuter, vous ne pouvez plus interagir avec eux car ils ne sont plus liés à aucun terminal. Cette méthode est principalement utile pour les processus de traitement par lots longs qui, une fois démarrés, ne nécessitent plus aucune entrée de l'utilisateur.
screen
vous avez beaucoup plus d'options, mais si vous utilisezauthorized_keys
pour permettre aux utilisateurs d'exécuter un script à distance viassh
, l'nohup
option est un moyen simple et agréable de lancer des processus qui durent plus longtemps que lassh
session utilisée pour les démarrer. .Il existe plusieurs façons de procéder, mais celle que je trouve la plus utile est d’utiliser GNU Screen .
Après que vous ssh dedans, courez
screen
. Cela va démarrer un autre shell en cours d'exécution dans l'écran. Exécutez votre commande, puis faites un Ctrl- a d.Cela vous "déconnectera" de la session d'écran. À ce stade, vous pouvez vous déconnecter ou faire tout ce que vous souhaitez.
Lorsque vous souhaitez vous reconnecter à la session d'écran, exécutez simplement à
screen -RD
partir de l'invite du shell (en tant que même utilisateur utilisateur que celui qui a créé la session).la source
En
bash
, ledisown
mot clé est parfaitement adapté à cela. Tout d’abord, exécutez votre processus en arrière-plan (utilisez&
ou^Z
tapezbg
):En tapant,
jobs
vous pouvez voir que le processus est toujours la propriété du shell:Si vous vous déconnectiez à ce stade, la tâche en arrière-plan serait également tuée. Cependant, si vous exécutez
disown
, bash détache le travail et lui permet de continuer à s'exécuter:Vous pouvez confirmer ceci:
Vous pouvez même combiner le
&
etdisown
sur la même ligne, comme:C'est mieux que de courir
nohup
à mon avis car cela ne laisse pas denohup.out
fichiers encombrés sur votre système de fichiers. De plus,nohup
doit être exécuté avant d'exécuter la commande -disown
peut être utilisé si vous ne décidez plus tard que vous voulez utiliser l'arrière-plan et détacher la tâche.la source
L'outil nohup, disponible sur la plupart des machines Linux, le fera.
la source
Pour être précis, je signalerai tmux , qui a la même idée de base que screen:
Cependant, il est environ infiniment plus facile de rechercher sur Google.
la source
"gnu screen"
comme requête de recherche fonctionne assez bien.L'écran est excessif pour ne garder que les processus en cours lorsque vous vous déconnectez.
Essayez dtach :
la source
Voici un moyen de démoniser n'importe quel processus shell, aucun programme externe n'est nécessaire:
Lorsque vous fermez ensuite votre session, le travail continue de s'exécuter comme le prouve le fichier output.txt (qui contient une mise en mémoire tampon, de sorte qu'il faut un certain temps pour afficher une valeur autre que zéro). N'oubliez pas de tuer votre travail après les tests.
Donc, tout ce que vous avez à faire est de fermer stdin et de mettre en arrière-plan le travail. Pour être vraiment bon, d'abord,
cd /
pour ne pas accrocher une monture.Cela fonctionne même en sh simple sous Solaris.
la source
-
opérateur? Et quelle est la différence entre< /dev/null
et&-
? Je suppose que STDIN (et d’autres STDOUT et STDERR) pourraient être affectés à un fichier< file
ou à un flux par<& stream
STDIN. Serait-ce la même chose< /dev/null
dans votre exemple ci-dessus? Et l'opérateur-
ci-dessus se réfère-t-il à une valeur nulle en tant que flux?La
at
commande peut être utile pour ce genre de situation. Par exemple, tapez:Et vous pouvez ensuite entrer une commande ou une série de commandes à exécuter. Les résultats doivent vous être envoyés par courrier électronique, si ce dernier est configuré correctement sur la machine.
Au lieu de
now
, vous pouvez spécifier une heure avec éventuellement une date ou une expression temporelle telle quenow + 15 minutes
. Voirman at
pour plus de détails.la source
byobu
sur Ubuntu est une belle interface à l'écran. En appuyant sur Ctrl- ?vous obtenez une liste de tous les raccourcis clavier. Il ajoute une barre d'état qui peut être utile pour surveiller la charge du processeur, l'espace disque, etc. Globalement, il fournit une expérience que je décrirais comme une connexion VNC basée sur un terminal.nohup
permet de démarrer un travail en arrière-plan avec sa sortie acheminée vers un fichier journal, qui peut toujours être redirigé vers / dev / null s'il n'est pas requis.la source