Exécutez une commande nohup sur SSH, puis déconnectez-vous


46

Je veux exécuter un script start.shsur un serveur distant qui exécute ceci:

nohup node server.js &

Naïvement, j'appelle SSH comme ceci:

ssh myserver <<EOF
./start.sh &
EOF

Cela démarre le script, mais laisse la session connectée. Je veux suivre cette étape avec d'autres commandes dans un script, donc ce n'est pas bon.

Comment puis-je SSH sur la machine distante, lancer une nohupcommande en arrière-plan, puis me déconnecter? Je suppose que je pourrais mettre le processus SSH en arrière-plan, mais cela ne semble pas correct.

Réponses:


40

Vous avez déjà trouvé le bon chemin, voici le document.

NOTE : vous pouvez mettre le ssh (client) en arrière-plan en plaçant un & à la fin, mais vous ne verrez pas la sortie. Si vous voulez vraiment faire cela, redirigez stdout / stderr vers un fichier au cas où vous auriez besoin de vérifier la réponse de l'hôte distant.

Fondamentalement, vous pouvez le faire de deux manières:

Lancer directement la commande {, s}

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

OU

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

NOTE : &&nécessite que la première commande renvoie 0 avant d'exécuter la seconde

Utiliser le document ici

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

Les 3 options ci-dessus devraient fonctionner pour vous.

De plus, jetez un coup d'œil à la réponse ici: https://askubuntu.com/a/348921/70270


Merci - alors le morceau qui me manquait était vraiment le > /dev/null.
Steve Bennett

Pas vraiment, > /dev/null 2>&1est de jeter toute sortie stdout / stderr en redirigeant vers le trou noir lol
Terry Wang

5
Notez que je suggérerais d'utiliser >> au lieu de> pour écrire dans les fichiers journaux. Sinon, vous n'obtiendrez les erreurs que lors de la dernière exécution.
Alexis Wilke

Est-il exact que si je lance simplement une commande comme nohup command2 >> /path/to/command2.log 2>&1 &dans un terminal puis ferme le terminal, le processus est perdu?
Luc

1
@TerryWang le deuxième exemple ne fonctionnera pas avec esperluette suivie de doubles esperluettes, voir unix.stackexchange.com/q/67006/86716
tsionyx

7

Pourquoi ne pas simplement tmux ou screen et en finir? Par exemple:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

C'est pratique si c'est quelque chose qui va tourner en boucle ou prendre du temps. Vous pouvez vous déconnecter de la session et celle-ci restera active.


2
Ne correspond pas vraiment à ce que je demande, à savoir une commande unique pouvant être exécutée sur mon ordinateur portable, qui se connecte, lance une commande, puis se déconnecte.
Steve Bennett

3
ssh node "nohup sleep 10 &"

ne fonctionne pas en mode démon, votre session ssh reste connectée. La session Ssh reviendra dans 10 secondes, malgré l'utilisation de nohup.

La raison est que stdout et stderr distants sont toujours connectés à votre session. Il maintient la session ssh en vie, nohup ne l’aide pas.

Cette:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

revient immédiatement. Il commence le processus à distance avec nohup et quitte immédiatement la session ssh.


C'était exactement notre problème. Nous n'avions qu'un 1> fichier.log. Le SSH sur la machine était bloqué. Le processus sur la machine "noeud" était en cours d'exécution. Lorsque nous avons ajouté un 2> & 1 juste avant la fermeture &, le ssh se déconnecte.
Lee Meador

2

Forme plus courte:

ssh host "(command 1; command 2; ...) &>/dev/null &"

Il semble que bash se déconnecte du terminal, donc aucun nohup n’est nécessaire. Je lance Ubuntu 14.04 x86_64, bash 4.3.11.


1
Cela ne fournit pas de réponse à la question. Pour critiquer ou demander des éclaircissements à un auteur, laissez un commentaire en dessous de son message - vous pouvez toujours commenter vos propres messages, et une fois que vous avez suffisamment de réputation, vous pourrez commenter n'importe quel message . - De l'avis
David Foerster le

Cela ne semble pas fonctionner. nohup; se contente de déposer une plainte concernant des arguments manquants.
Steve Bennett

@ DavidFoerster, aucune idée pourquoi, si le command 1; command 2; ...script OP veut être exécuté. OP peut également utiliser un cas spécial de cette réponse:ssh myserver ./start.sh &>/dev/null &
Alek_A
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.