Quelle est la meilleure façon d'exécuter une commande ssh distante en arrière-plan mais toujours affichée?

15

J'ai besoin d'exécuter des commandes SSH à distance avec la sortie affichée localement. Mais si la connexion est interrompue, je veux que la commande continue de s'exécuter.

Je ne parle pas tellement de connexion et d'exécution mais de faire ssh user @ remotehost 'commandes && commande etc'

Comment puis-je m'assurer que la commande s'exécute même si la connexion est interrompue?

vfclists
la source

Réponses:

27

La meilleure façon de le faire est d'utiliser screen, qui maintient la session ouverte de manière persistante même si la connexion s'éteint (et si vous voulez recommencer à l'utiliser, vous pouvez faire un screen -r et il l'ouvrira à nouveau).

Préfixer la commande que vous souhaitez exécuter screen (par exemple ssh -t user@host screen command) devrait faire le travail.

Si vous souhaitez qu'il s'exécute en arrière-plan du shell, vous pouvez également ajouter un &à l'ensemble.

Falcon Momot
la source
Vous devrez probablement utiliser ssh -t pour allouer un terminal pour l'exécution de la commande. Sinon, l'erreur est "Doit être connecté à un terminal".
bonsaiviking
11

Cherchez-vous à avoir une session persistante que vous pouvez reprendre, ou tout simplement pour empêcher une déconnexion de tuer l'exection?

Pour les premiers, utilisez screen, pour les seconds nohup,.

Shane Madden
la source
7

Comme mentionné précédemment, screenpeut faire tout le tour. Mais pas seulement ce dont vous avez besoin. J'utilise screen depuis des années et je l'utilise maintenant chaque fois que je me connecte aux systèmes. Essayez d'installer screenet de créer ~/.screenrcavec une telle configuration:

sessionname     vcflists
startup_message off
deflogin        off
vbell           off
msgminwait      0
msgwait         10
log             off
backtick        1 0 0 hostname
caption splitonly "%?%F%{= yk}%:%{= Kk}%? %n %t%="
hardstatus alwayslastline "%{= rY}  %1`  %{= kg} %0c %{= bY}  %-w%{= Yk} %n %t %{-}%+w %=%{g}%l "

Exécutez ensuite screen -Rd vcf. C'est l'invocation préférable de l'écran. Vous vous reconnecterez à la session précédemment créée avec le nom vcf * (ou serez averti si ambigu) ou, si la session n'est pas encore ouverte, elle sera créée. CTRL+ Aest une méta clé qui fait tout. CTRL+A C( CTRL+ A, puis C) créer une nouvelle fenêtre (écran) à l'intérieur de la session. CTRL+A SPACEdéplacer le focus vers la fenêtre suivante dans un tour. CTRL+A Ddétacher la session en cours en gardant toutes les fenêtres fonctionnelles entre les connexions. Si vous avez lancé une tâche looooong, vous pouvez vous détacher de l'écran et le rattacher plus tard pour voir ce qui se passe. La même chose se produit si votre session ssh est perdue - l'écran reste vivant avec toutes les fenêtres ouvertes et toutes les tâches lancées.

Si vous voulez fermer une fenêtre à l'intérieur de l'écran - juste à exitpartir du shell. Si vous souhaitez fermer tous les shells / tâches dans toutes les fenêtres et quitter l'écran - appuyez simplement sur CTRL+A CTRL+\et appuyez sur "Y" lorsque vous y êtes invité.

Pour tout le reste, voir l'écran homme.

Kondybas
la source
2

J'ai vu cette alternative à une connexion ssh fiable "like":

http://mosh.mit.edu/

Rodrigo Prior Bechelli
la source
Depuis le site, mosh (coque mobile) ressemble à un nouvel outil prometteur. C'est très nouveau, cependant.
bgvaughan
1

Je fais habituellement:

nohup mycommand &

tail -f nohup.out
gyin
la source