2009-06-25 5 views
5

J'essaie de lancer en arrière-plan un travail sur une machine distante et d'obtenir son PID pour pouvoir le tuer plus tard. Ce que j'ai trouvé jusqu'à présent est la suivante:Lancer à distance le pid d'un travail lancé en arrière-plan

#!/bin/bash 

IP=xxx.xxx.xxx.xx 
REMOTE_EXEC="ssh $IP -l root" 

# The following does NOT work, I am trying to get the PID of the remote job 
PID=`$REMOTE_EXEC 'vmstat 1 1000 > vmstat.log & ; echo $!'` 

# Launch apache benchmark 
ab -n 10 http://$IP/ 

$REMOTE_EXEC "kill $PID" 

Malheureusement, cela ne fonctionne pas. Je reçois un

bash: syntax error near unexpected token `;' 

mais je ne sais pas quelle serait la bonne syntaxe.

+0

simplement: 'vmstat 1 1000> vmstat.log &; echo $! ' ne même pas localement. Jetez un coup d'oeil. –

+0

Oui, je sais. J'ai donc besoin d'un correctif pour 'vmstat 1 1000> vmstat.log &; echo $! ' ou je dois obtenir le PID du travail à distance par un autre mécanisme. – davitenio

+0

@davitenio Le PID ne se termine-t-il pas en tant que PID de la commande ssh locale, et non de la commande vmstat distante? –

Répondre

3

Vous avez l'erreur, car vous ';' est redondant, essayez 'vmstat 1 1000> vmstat.log & echo $!'

Mais je ne suis pas sûr que ça va marcher, car après la déconnexion, le processus recevra SIGHUP. Regardez nohup (1).

+0

Cela fonctionne, même sans utiliser nohup. Merci! – davitenio

+0

Ouais, vous avez raison ... Peut-être, il arrive, car dans ce cas SSH ne vous "connecte" pas (à partir de ssh (1): "Si la commande est spécifiée, elle est exécutée sur l'hôte distant au lieu d'un login shell. "). – dmitri

2

Essayez entourant la commande backgrounded accolades:

PID=`$REMOTE_EXEC '{ vmstat 1 1000 > vmstat.log & }; echo $!'` 
0

Si vous utilisez faible citation, vous avez besoin d'échapper à $! comme ce qui suit:

$REMOTE_EXEC "{ vmstat 1 1000 > vmstat.log & }; echo \$!" 

ou

P=`$REMOTE_EXEC "{ vmstat 1 1000 > vmstat.log & }; echo \\\$!"` 
+0

Je reçois -bash:.! ": Événement non trouvé avec hôte ssh « Il fonctionne parfaitement sur Ubuntu 12 et plus {exécutable & }; echo \ $ » –

+0

Cela dépend de votre système d'exploitation Si vous utilisez. citation faible, essayez d'échapper! symbole aussi comme décrit ici http://serverfault.com/questions/208265/what-is-bash-event-not-found ou ne pas utiliser de faibles citations – Rom098

+0

J'ai trouvé le problème - il Si j'ai utilisé cette ligne à l'intérieur d'un script, cela a fonctionné correctement, mais si je l'ai exécuté directement à partir d'un terminal, il a échoué.Si j'éteins l'expansion de l'historique avec 'set + H', alors cela fonctionne correctement à partir du terminal. –