2010-09-01 6 views
1

NOTE: Je pensais que j'utilisais bash, mais/bin/sh est lié à/bin/dash, qui a ce problème d'exec bizarre.Comment trouver le PID d'une commande dash-exec

J'ai un simple script shell bash sur Linux qui est utilisé pour lancer un processus serveur (que je n'ai pas écrit ou contrôlé) et souhaite que le script shell bash produise le PID du processus lancé dans un fichier pid.

Le problème est que la commande bash-exec ne remplace pas son propre processus par le processus serveur lancé!

Alors:

echo $$ | cat > /var/run/launched-server.pid 

Cela ne pas travail parce que le pid dans le fichier sera celui de bash pas le processus serveur. Et si le processus serveur quitte, bash ne peut pas quitter, laissant le script de lancement stupide traîner dans la liste des processus.

Est-ce que quelqu'un connait un moyen d'utiliser bash (ou un tiret peut-être?) De sorte que:

  1. Est-il possible?
  2. Le PID du processus du serveur de lancement sera dans mon fichier pidfile?
  3. Assurez-vous que le script bash mourra lorsque le serveur lancé existe et ne laissera pas de processus shell défunts dans la liste des processus?

Edit: Cet extrait de la bash reference manual être d'utilisation ...

exec 
      exec [-cl] [-a name] [command [arguments]] 

Si la commande est fourni, il remplace le shell sans créer un nouveau processus. Si l'option -l est fournie, le shell place un tiret au début de l'argument zeroth passé à la commande. C'est ce que fait le programme de connexion. L'option -c provoque l'exécution de la commande avec un environnement vide. Si -a est fourni, le shell passe le nom comme l'argument zeroth à commander. Si aucune commande n'est spécifiée, les redirections peuvent être utilisées pour affecter l'environnement shell actuel. S'il n'y a pas d'erreur de redirection, le statut de retour est zéro; sinon, l'état de retour est différent de zéro.


Edit 2: Ceci est le script (aseptisé):

#!/bin/sh 

# this is where the server expects to run its services for Daemontools 
SERVICE_DIR='/var/service'; 

# kill stdout, stderr, stdin 
exec </dev/null 
exec >/dev/null 
exec 2>/dev/null 

logger -ip daemon.debug -- stdout, stderr, stdin redirected to /dev/null 

if [ -d $SERVICE_DIR ]; then 
    # sanitized... 
    logger -ip daemon.debug -- services and supervisors exited 
else 
    logger -ip daemon.err -- $SERVICE_DIR does not exist, exiting 
    exit 1; 
fi 

if [ -d /var/run/pid ]; then 
    echo $$ | cat > /var/run/pid/launched-server.pid 
    logger -ip daemon.debug -- creating launched-server pidfile 
fi 

# start the server process 
logger -ip daemon.info -- launching server on $SERVICE_DIR 
exec /usr/local/bin/launched-server 

Et une sortie ps pour être peut-être plus clair?

[email protected]: ~/dev $ ps ax | grep launched-server 
13896 pts/1 S+  0:00 /bin/sh ./server_boot 
13905 pts/1 S+  0:00 launched-server /var/service 
13938 pts/2 R+  0:00 grep --color=auto launched-server 
+0

Il n'est pas nécessaire d'utiliser 'cat':' echo $$>/var/run/pid/launch-server.pid' –

+0

@ Dennis-Williamson - Bonne prise, merci. – Petriborg

Répondre

1

Votre distribution inclut-elle start-stop-daemon(8)? Merveilleusement utile petit outil, il a été construit spécifiquement pour démarrer des démons à partir de scripts shell. (Bien sûr, les daemons vivent plus longtemps que les scripts shell, donc il ne peut pas être un match parfait - cela dépend de la raison pour laquelle vous voulez que le shell survivra votre démon.)

Ou, pour quelque chose de plus simple:

pourrait votre problème soit résolu avec la commande exec de bash?Il remplace le processus shell avec ce programme que vous demandez à exécuter:

#!/bin/bash 

echo $$ > /tmp/pidfile 
exec /bin/sleep 60 

$ ./show_exec.sh 
[nothing happens] 

Et, dans un autre shell:

$ cat pidfile 
24686 
$ ps auxw | grep 24686 
sarnold 24686 0.0 0.0 9728 816 pts/1 S+ 04:53 0:00 /bin/sleep 60 
+0

L'un des problèmes est que le script survit au démon, et non l'inverse :-) C'est probablement un problème simple que je suis juste en train de m'embrouiller .. – Petriborg

+0

Alors que votre réponse ne me donne pas directement une solution en bash- par-dire, je dois dire que le démon start-stop était sur place et qu'il est un super petit logiciel. J'ai "résolu" mon problème avec l'exec de bash en l'utilisant. – Petriborg

2

Je me rends compte maintenant ce que le vrai problème était:

En utilisant #!/bin/sh Je n'appelais pas bash, mais dash.

L'exec de Dash est le shell avec le problème d'exec. Si j'avais utilisé #!/bin/bash depuis le début, cela aurait fonctionné comme prévu.

Questions connexes