Je veux lancer un processus en utilisant nohup sur une machine distante via ssh. Le problème est de savoir comment obtenir le PID du processus lancé avec nohup, c'est-à-dire le "processus en train de faire quelque chose", et non une instance de shell externe ou autre. De plus, je veux stocker stdout et stderr dans des fichiers, mais ce n'est pas le problème ici...
Localement, il fonctionne parfaitement en utilisant
nohup sleep 30 > out 2> err < /dev/null & echo $!
Il me renvoie le PID exact de la commande "sleep 30", que je peux également voir en utilisant "top" ou "ps aux|grep sleep".
Mais j'ai du mal à le faire à distance via ssh. J'ai essayé quelque chose comme
ssh remote_machine 'nohup bash -c "( ( sleep 30 ) & )" > out 2> err < /dev/null'
mais je n'arrive pas à trouver où placer le "echo $ !" pour qu'il s'affiche dans mon shell local. Il me montre toujours de mauvais PIDs, par exemple celui de l'instance "bash", etc.
Quelqu'un a-t-il une idée de la façon de résoudre ce problème ?
EDIT : OK, le "bash -c" n'est peut-être pas nécessaire ici. Comme Lotharyx l'a fait remarquer, j'obtiens le bon PID en utilisant
ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!'
mais le problème est que si vous remplacez "sleep 30" par quelque chose qui produit une sortie, par exemple "echo Hello World !", cette sortie ne se retrouve pas dans le fichier "out", ni du côté local ni du côté distant. Quelqu'un a une idée de la raison ?
EDIT2 : Ma faute ! Il n'y avait tout simplement plus de place sur l'autre appareil, c'est pourquoi les fichiers "out" et "err" sont restés vides !
Cela fonctionne donc. De plus, si l'on veut appeler plusieurs commandes à la suite, séparées par un point-virgule ( ;), on peut toujours utiliser "bash -c", comme ceci :
ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!'
Ensuite, il affiche le PID de "bash -c" du côté local, ce qui est très bien. (Il est impossible d'obtenir le PID du processus "le plus interne" ou "le plus occupé", car chaque programme lui-même peut engendrer de nouveaux sous-processus, il n'y a aucun moyen de le savoir...)