Solution 1 :
La meilleure méthode consiste à démarrer le processus dans un multiplexeur de terminal. Vous pouvez également faire en sorte que le processus ne reçoive pas le signal HUP.
Un multiplexeur de terminaux fournit des terminaux "virtuels" qui fonctionnent indépendamment du terminal "réel" (en fait, tous les terminaux aujourd'hui sont "virtuels", mais c'est un autre sujet pour un autre jour). Le terminal virtuel continuera de 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 reconnecterez au serveur vous pourrez vous reconnecter au terminal virtuel et tout se passera comme si de rien n'était, à part le temps qui s'est écoulé.
Screen et tmux sont deux multiplexeurs de terminaux populaires.
L'écran a une courbe d'apprentissage abrupte. Voici un bon tutoriel avec des schémas 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 est de terminer. Ainsi, lorsque votre session ssh est déconnectée, tous vos processus se terminent. Pour éviter cela, vous pouvez faire en sorte que vos processus ne reçoivent pas SIGHUP.
Deux méthodes simples pour le faire sont nohup
et disown
.
Pour plus d'informations sur la façon dont nohup
et disown
fonctionne lire cette question et répondre :https://unix.stackexchange.com/questions/3886/difference-between-nohup-disown-and
Remarque :bien que les processus continuent de fonctionner, vous ne pouvez plus interagir avec eux car ils ne sont plus attachés à aucun terminal. Cette méthode est principalement utile pour les processus batch de longue durée qui, une fois démarrés, n'ont plus besoin d'aucune intervention de l'utilisateur.
Solution 2 :
Il existe plusieurs façons de procéder, mais celle que je trouve la plus utile consiste à utiliser GNU Screen.
Après vous être connecté en ssh, exécutez screen
. Cela lancera un autre shell en cours d'exécution dans l'écran. Exécutez votre commande, puis faites un Ctrl -un 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 qui a créé la session).
Solution 3 :
En bash
, le disown
mot-clé est parfaitement adapté à cela. Tout d'abord, exécutez votre processus en arrière-plan (soit utilisez &
, ou ^Z
puis tapez bg
):
$ wget --quiet http://server/some_big_file.zip &
[1] 1156
En tapant jobs
vous pouvez voir que le processus appartient toujours au shell :
$ jobs
[1]+ Running wget
Si vous deviez vous déconnecter à ce stade, la tâche en arrière-plan serait également supprimée. Cependant, si vous exécutez disown
, bash détache la tâche et lui permet de continuer à s'exécuter :
$ disown
Vous pouvez le confirmer :
$ jobs
$ logout
Vous pouvez même combiner les &
et disown
sur la même ligne, comme :
$ wget --quiet http://server/some_big_file.zip & disown
$ logout
C'est mieux que d'exécuter nohup
à mon avis car il ne laisse pas nohup.out
fichiers éparpillés partout dans votre système de fichiers. Aussi, nohup
doit être exécuté avant d'exécuter la commande — disown
peut être utilisé si vous ne décidez que plus tard que vous souhaitez mettre en arrière-plan et détacher la tâche.
Solution 4 :
L'outil nohup, disponible sur la plupart des machines Linux, le fera.
Solution 5 :
Juste pour être complet, je soulignerai tmux, qui a la même idée de base que screen :
tmux est destiné à être une alternative moderne sous licence BSD aux programmes tels que GNU screen. Les fonctionnalités principales incluent :
- Une interface de commande puissante, cohérente, bien documentée et facilement scriptable.
- Une fenêtre peut être divisée horizontalement et verticalement en volets.
- Les volets peuvent être librement déplacés et redimensionnés, ou organisés selon des dispositions prédéfinies.
- Compatibilité avec les terminaux UTF-8 et 256 couleurs
- Copiez et collez avec plusieurs tampons.
- Menus interactifs pour sélectionner des fenêtres, des sessions ou des clients.
- Modifier la fenêtre actuelle en recherchant du texte dans la cible.
- Verrouillage du terminal, manuellement ou après un délai d'attente.
- Une base de code propre, facilement extensible, sous licence BSD, en cours de développement actif.
Il est cependant approximativement infiniment plus facile de rechercher sur Google.