2017-05-26 1 views
0

Je voudrais obtenir le PID d'un processus que je démarre via ssh.Récupère le PID du processus nohup via ssh

J'ai un script bash et voici ce que je l'ai écrit:

SSH_COMMAND='ssh' 
cmd=`eval $my_cmd` 
PROG_CMD="$program $cmd" 
$SSH_COMMAND [email protected] "(nohup $PROG_CMD) & echo "'$!'" > prog.pid" 

Notez que les variables « programme » et « my_cmd » sont définis dans un fichier JSON (et contiennent, respectivement, mon programme et la commande pour démarrer mon programme).

Mon programme est démarré sur le serveur exactement comme il est censé démarrer mais je n'ai pas le PID correct (c'est-à-dire le PID du programme) dans le fichier prog.pid.

EDIT: je l'ai fait l'écho de la SSH_COMMAND et je me suis:

ssh [email protected] (my_program args > output.log 2>&1 &) & echo $! > prog.pid 

args: arguments de mon_programme

output.log: le fichier journal de mon programme

+0

où le prog.pid devrait dans le répertoire de racine du serveur? –

+0

Non, le prog.pid est situé sur la "machine locale", où je fais la commande ssh. Mais les problèmes ne sont pas ici. J'ai le fichier prog.pid avec un PID écrit à l'intérieur ... c'est juste pas le bon! – klaus

+0

dans la première commande prog.id était à l'intérieur de la commande ssh entre guillemets doubles donc attendu sur –

Répondre

1

Ne pas utiliser (command &) &. Il suffit d'utiliser (command) & (ou juste command &?). Avec (command &) &, Bash doit fourchette un autre sous-shell pour exécuter la commande si $! serait le PID du sous-shell autre que la commande.

Voir exemple suivant:

[STEP 124] # (nohup sleep 1234 > /dev/null 2>&1 &) & 
[1] 44420  <=== this is the PID of the sub-shell which died immediately 
[STEP 125] # 
[1]+ Done     (nohup sleep 1234 > /dev/null 2>&1 &) 
[STEP 126] # ps p 44420 <=== as you can see this PID does not exist any more 
    PID TTY  STAT TIME COMMAND 
[STEP 127] # ps -C sleep u 
USER  PID TTY  STAT START TIME COMMAND 
root  44421 pts/13 S 17:48 0:00 sleep 1234 
[STEP 128] # kill 44421 
[STEP 129] # 

Cela fonctionne très bien:

[STEP 131] # (nohup sleep 1234 > /dev/null 2>&1) & 
[1] 44424   <=== this is the PID of the sleep command 
[STEP 132] # ps p 44424 u 
USER  PID TTY  STAT START TIME COMMAND 
root  44424 pts/13 S 17:49 0:00 sleep 1234 
[STEP 133] # 
+0

Vous aviez raison, j'ai supprimé le & et le PID était le bon. De plus, ta réponse explique parfaitement ce qui se passe, merci beaucoup. – klaus

0

Pour écrire le fichier prog.pid (avec pid distant) sur la machine locale vient de sortir la redirection de l'intérieur des citations

$SSH_COMMAND [email protected] "(nohup $PROG_CMD) & echo "'$!' > prog.pid 

Si le pid voulait processus local est ssh echo $! doit être retiré commande ssh

$SSH_COMMAND [email protected] "(nohup $PROG_CMD)" & echo $! > prog.pid 
+0

Non, j'ai essayé et ça n'a rien changé. Le problème n'est pas d'écrire un PID dans un fichier mais d'écrire le bon PID! – klaus

+0

Avez-vous lu correctement la réponse comme dans la question on ne sait pas quel PID est intéressant, la première commande donne le PID de la commande nohup exécutée sur le serveur distant, alors que la seconde le PID de la commande ssh locale –

+0

PID de la commande nohup, j'ai essayé votre réponse en mettant la redirection de guillemets à l'intérieur et le PID dans le prog.pid était 11043 alors que le vrai PID de mon programme était 11044. – klaus