comment exécuter une commande en arrière-plan à l'aide de ssh et détacher la session

StackOverflow https://stackoverflow.com/questions/1628204

  •  06-07-2019
  •  | 
  •  

Question

J'essaie actuellement de ssh sur une machine distante et d'exécuter un script, puis de laisser le nœud avec le script en cours d'exécution. Ci-dessous, mon script. Toutefois, lorsqu’il est exécuté, le script est exécuté avec succès sur la machine mais la session ssh se bloque. Quel est le problème?

ssh -x $username@$node 'rm -rf statuslist
                        mkdir statuslist
                        chmod u+x ~/monitor/concat.sh
                        chmod u+x ~/monitor/script.sh
                        nohup ./monitor/concat.sh &
                        exit;'
Était-ce utile?

La solution

Dans certains cas, vous souhaitez exécuter / démarrer des scripts sur une machine / un serveur distant (qui se terminera automatiquement) et vous déconnecter du serveur.

Exemple: un script s'exécutant sur une boîte qui, une fois exécuté,

  1. prend un modèle et le copie sur un serveur distant
  2. crée un script pour exécuter une simulation avec le modèle et le pousser sur le serveur
  3. lance le script sur le serveur et déconnecte
  4. Le script ainsi démarré a pour tâche d'exécuter la simulation sur le serveur et, une fois l'opération terminée (il faudra plusieurs jours), recopie les résultats sur le client.

J'utiliserais la commande suivante:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &'

@CKeven, vous pouvez placer toutes ces commandes dans un seul script, le transmettre au serveur distant et l'initialiser comme suit:

echo '#!/bin/bash  
rm -rf statuslist  
mkdir statuslist  
chmod u+x ~/monitor/concat.sh  
chmod u+x ~/monitor/script.sh  
nohup ./monitor/concat.sh &  
' > script.sh

chmod u+x script.sh

rsync -azvp script.sh remotehost:/tmp

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &'

J'espère que ça marche ;-)

Modifier: Vous pouvez aussi utiliser ssh utilisateur @ hôte 'écran -S NomSession -d -m "/ chemin / vers / exécutable"'

Qui crée une session d'écran séparée et exécute la commande target en son sein

Autres conseils

Que pensez-vous de l’utilisation de screen pour cela? Vous pouvez exécuter screen via ssh pour lancer la commande ( concat.sh ), puis vous pourrez revenir à la session screen si vous souhaitez la surveiller (possibilité soyez pratique, selon ce que concat fait).

Pour être plus précis, essayez ceci:

ssh -t $username@$node screen -dm -S testing ./monitor/concat.sh

Vous devriez constater que l'invite revient immédiatement et que concat.sh est en cours d'exécution sur la machine distante. Je vais expliquer certaines des options:

  • ssh -t crée un ATS. L’écran en a besoin.
  • screen -dm le fait démarrer à " détaché " mode. Cela ressemble à " arrière-plan " à vos fins.
  • Les tests de
  • -S attribuent un nom à votre session d’écran. C'est facultatif mais recommandé.

Maintenant, une fois que vous avez terminé, vous pouvez accéder à la machine distante et exécuter ceci:

screen -r testing

Ceci vous attachera à la session d’écran qui contient votre programme. A partir de là, vous pouvez le contrôler, le tuer, voir sa sortie, etc. Ctrl-A, puis d vous séparera de la session d’écran. screen -ls listera toutes les sessions en cours.

Il pourrait s'agir du flux d'entrée standard. Essayez ssh -n ... ou ssh -f ... .

Pour moi, seul cela a fonctionné:

screen -dmS name sh my-script.sh

Cela dépend bien sûr de l’écran et vous permet d’attacher plus tard, si vous voulez un jour stdin ou stdout. Screen se terminera à la fin de my-script.sh.

Vous trouverez ci-dessous une décision beaucoup plus courante qui nécessitait quelques efforts, et cela fonctionne vraiment pour moi:

#!/usr/bin/bash
theScreenSessionName="test"
theTabNumber="1"
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top"

echo "this is a test"

ssh -f user@server "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff
\""

Il envoie la liste de commandes $ theStuff à l’onglet No No theTabNumber de la session écran $ theScreenSessionName préalablement créé sur le 'serveur' pour le compte de 'utilisateur'.

S'il vous plaît être conscient d'un espace de fin après -X choses \ " qui est envoyé pour surmonter le problème d'une option 'truc'. Les espaces et $ theStuff de la ligne suivante sont ajoutés par des touches du clavier "Entrée" (^ M). NE MANQUEZ PAS EM!

Le "Ceci est un test" le message est répercuté dans le terminal initial et les commandes $ theStuff sont réellement exécutées à l'intérieur de l'écran / onglet mentionné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top