Il s'agit d'une question complémentaire à Comment utilisez-vous ssh dans un script shell? question. Si je veux exécuter une commande sur la machine distante qui s'exécute en arrière-plan sur cette machine, comment puis-je obtenir la commande ssh pour revenir? Lorsque j'essaie d'inclure simplement l'esperluette (&) à la fin de la commande, elle se bloque simplement. La forme exacte de la commande ressemble à ceci:
ssh user@target "cd /some/directory; program-to-execute &"
Des idées? Une chose à noter est que les connexions à la machine cible produisent toujours une bannière de texte et j'ai des clés SSH configurées donc aucun mot de passe n'est requis.
/dev/null
.< /dev/null
que cela signifie? Merci.Cela a été la façon la plus propre de le faire pour moi: -
La seule chose qui s'exécute après cela est la commande réelle sur la machine distante
la source
-n
n'est pas nécessaire comme l'-f
indique-n
ssh -f
laisse le processus ssh connecté, juste en arrière-plan. Les solutions / dev / null permettent à ssh de se déconnecter rapidement, ce qui pourrait être préférable.Rediriger les fd
La sortie doit être redirigée avec
&>/dev/null
laquelle redirige à la fois stderr et stdout vers / dev / null et est un synonyme de>/dev/null 2>/dev/null
ou>/dev/null 2>&1
.Parantheses
La meilleure façon est d'utiliser
sh -c '( ( command ) & )'
où la commande est n'importe quoi.Nohup Shell
Vous pouvez également utiliser nohup directement pour lancer le shell:
Nice Launch
Une autre astuce consiste à utiliser nice pour lancer la commande / shell:
la source
nohup
fait, et pourquoi et quand vous l'utiliserieznice
? Je pense que cela ajouterait beaucoup à cette réponse.Si vous ne maintenez pas / ne pouvez pas garder la connexion ouverte, vous pouvez utiliser l' écran , si vous avez les droits pour l'installer.
Pour détacher la session écran: ctrl-a d
Pour répertorier les sessions d'écran:
Pour rattacher une session:
Notez que l'écran peut également créer plusieurs shells dans chaque session. Un effet similaire peut être obtenu avec tmux .
Pour détacher la session tmux: ctrl-b d
Pour répertorier les sessions d'écran:
Pour rattacher une session:
La clé de contrôle tmux par défaut, ' ctrl-b', est quelque peu difficile à utiliser, mais il existe plusieurs exemples de configurations tmux livrées avec tmux que vous pouvez essayer.
la source
screen
cela?Je voulais juste montrer un exemple de travail que vous pouvez couper et coller:
la source
Le moyen le plus rapide et le plus simple consiste à utiliser la commande «at»:
la source
at
arguments de ligne de commande étaient acceptés après l'heure et pas seulement à partir d'un fichier.Je pense que vous devrez combiner quelques-unes de ces réponses pour obtenir ce que vous voulez. Si vous utilisez nohup en conjonction avec le point-virgule et enveloppez le tout entre guillemets, vous obtenez:
qui semble fonctionner pour moi. Avec nohup, vous n'avez pas besoin d'ajouter le & à la commande à exécuter. De plus, si vous n'avez pas besoin de lire la sortie de la commande, vous pouvez utiliser
pour rediriger toutes les sorties vers / dev / null.
la source
Cela a fonctionné pour moi plusieurs fois:
la source
Vous pouvez le faire comme ça ...
la source
En fait, chaque fois que j'ai besoin d'exécuter une commande sur une machine distante qui est compliquée, j'aime mettre la commande dans un script sur la machine de destination et simplement exécuter ce script en utilisant ssh.
Par exemple:
Et puis je lance juste cette commande sur la machine source:
la source
J'essayais de faire la même chose, mais avec la complexité supplémentaire que j'essayais de faire depuis Java. Donc, sur une machine exécutant java, j'essayais d'exécuter un script sur une autre machine, en arrière-plan (avec nohup).
À partir de la ligne de commande, voici ce qui a fonctionné: (vous n'aurez peut-être pas besoin du "-i keyFile" si vous n'en avez pas besoin pour ssh vers l'hôte)
Notez que sur ma ligne de commande, il y a un argument après le "-c", qui est tout entre guillemets. Mais pour que cela fonctionne à l'autre bout, il a toujours besoin des guillemets, j'ai donc dû y mettre des guillemets échappés.
De Java, voici ce qui a fonctionné:
Il a fallu un peu d'essais et d'erreurs pour que cela fonctionne, mais cela semble bien fonctionner maintenant.
la source
Il m'a semblé assez pratique d'avoir une session tmux à distance en utilisant la
tmux new -d <shell cmd>
syntaxe comme ceci:Cela lancera une nouvelle session sur l'
elsewhere
hôte et la commande ssh sur la machine locale reviendra au shell presque instantanément. Vous pouvez ensuite ssh vers l'hôte distant ettmux attach
vers cette session. Notez qu'il n'y a rien sur tmux local en cours d'exécution, seulement à distance!De plus, si vous souhaitez que votre session persiste une fois le travail terminé, ajoutez simplement un lanceur de shell après votre commande, mais n'oubliez pas de mettre entre guillemets:
la source
Cela devrait exécuter la commande et attribuer un identifiant de processus que vous pouvez simplement taper -f YOUR-LOG.log pour voir les résultats qui y sont écrits au fur et à mesure. vous pouvez vous déconnecter à tout moment et le processus se poursuivra
la source
Vous pouvez le faire sans nohup:
la source
Je pense que c'est ce dont vous avez besoin: au début, vous devez installer
sshpass
sur votre machine. alors vous pouvez écrire votre propre script:la source
Suivez d'abord cette procédure:
Connectez-vous à A en tant qu'utilisateur a et générez une paire de clés d'authentification. N'entrez pas de phrase secrète:
Utilisez maintenant ssh pour créer un répertoire ~ / .ssh en tant qu'utilisateur b sur B. (Le répertoire peut déjà exister, ce qui est bien):
Enfin, ajoutez la nouvelle clé publique de a à b @ B: .ssh / authorized_keys et entrez une dernière fois le mot de passe de b:
Vous pouvez désormais vous connecter à B en tant que b à partir de A en tant que sans mot de passe:
alors cela fonctionnera sans entrer de mot de passe
ssh b @ B "répertoire cd / certains /; programme à exécuter &"
la source