La résiliation de la session SSH exécuté par script bash
J'ai un script que j'ai peut fonctionner localement pour démarrer à distance un serveur:
#!/bin/bash
ssh user@host.com <<EOF
nohup /path/to/run.sh &
EOF
echo 'done'
Après l'exécution de nohup, il se bloque. Je dois frapper ctrl-c pour quitter le script.
J'ai essayé l'ajout explicite d'une sortie à la fin de la doc ici et en utilisant "-t" argument pour ssh. Aucun ne fonctionne. Comment puis-je faire ce script quitter immédiatement?
EDIT: Le client est OSX 10.6, serveur Ubuntu.
Ce client SSH utilisez-vous? L'option-t, devrait fonctionner à moins que le client est en train de faire quelque chose de bizarre.
Oups devrait avoir mentionné c'est sur OSX, standard client ssh. Mise à jour de la question.
Quelle est la signification des expressions du FOLKLORE?
De Fichier", mais c'est un Heredoc toute autre mot pourrait avoir été utilisé, par exemple, à la FIN. Tant qu'il est le même dans les deux endroits.
Oups devrait avoir mentionné c'est sur OSX, standard client ssh. Mise à jour de la question.
Quelle est la signification des expressions du FOLKLORE?
De Fichier", mais c'est un Heredoc toute autre mot pourrait avoir été utilisé, par exemple, à la FIN. Tant qu'il est le même dans les deux endroits.
OriginalL'auteur mahemoff | 2011-08-16
Vous devez vous connecter pour publier un commentaire.
Je pense que le problème est que nohup ne pouvez pas rediriger la sortie quand vous venez à partir de ssh, il ne redirige vers nohup.quand il pense qu'il est connecté à un terminal, et je le stdin remplacer vous avez permettra d'éviter que, même avec
-t
.Une solution pourrait être de rediriger la sortie vous-même, alors le client ssh peut se déconnecter, c'est de ne pas attendre pour le flux de fermer. Quelque chose comme:
(Cela a fonctionné pour moi dans un simple test de la connexion à un serveur Ubuntu à partir d'un client OS X.)
J'ai un problème similaire à l'OP. Je suis ssh-ing à partir d'un
csh
script, d'exécuter des commandes à distance, et de tenter d'envoyer le résultat à une variable dans lecsh
script. Vous pensez que c'est possible? Je vais avoir le même message d'erreur: je suis en train de fairessh -t -t
et l'obtention de l'erreur:Inappropriate IOCtl for device
OriginalL'auteur martin clayton
Le problème pourrait être que ...
Par conséquent, une solution pourrait être de se détacher de la
stdin
de lanohup
commande à partir de l'ats:Voir: SSH se Bloque Sur la Sortie Lors de l'Utilisation de nohup
Pourtant, une autre approche pourrait être d'utiliser
ssh -t -t
de force pseudo-tty allocation, même sistdin
n'est pas un terminal.Voir: BASH frayer shell interne est exécuté pour le SSH et continuer avec le flux de programme
OriginalL'auteur chad
La redirection de l'entrée standard stdin de l'hôte distant à partir d'un document ici, tout en invoquant
ssh
sans une commande explicite conduit à la message:Pseudo-terminal will not be allocated because stdin is not a terminal.
Pour éviter ce message soit utiliser
ssh
's-T
interrupteur à dire à l'hôte distant n'est pas nécessaire d'attribuer un pseudo-terminal ou explicitement spécifier une commande (comme/bin/sh
) pour l'hôte distant pour exécuter les commandes fournies par le document.Si une commande explicite est donné à
ssh
, la valeur par défaut est de fournir pas shell de connexion sous la forme d'un pseudo-terminal, j'. e. il n'y aura pas normal session de connexion lorsqu'une commande est spécifiée (voirman ssh
).Sans une commande spécifiée pour
ssh
, d'autre part, la valeur par défaut est de créer un pseudo-tty pour une connexion interactive session sur l'hôte distant.En règle générale,
ssh -t
ou mêmessh -t -t
doit être utilisé uniquement si il y a des commandes qui attendent stdin /stdout pour être un terminal (commetop
ouvim
) ou s'il est nécessaire de tuer le shell distant et de ses enfants lors de lassh
de commande du client a terminé l'exécution (voir: la commande ssh de manière inattendue continue sur d'autres système après ssh se termine).Autant que je peux dire, le seul moyen de combiner une
ssh
commande qui n'attribue pas de pseudo-tty et unnohup
de commande qui écrit ànohup.out
sur l'hôte distant est de laisser lenohup
de l'exécution des commandes dans un pseudo-terminal pas créé par lessh
mécanisme. Cela peut être fait avec lescript
de commande, par exemple, et permettra d'éviter latcgetattr: Inappropriate ioctl for device
message.OriginalL'auteur tarox
Vous avez besoin d'ajouter un
exit 0
à la fin.OriginalL'auteur jschorr