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:
- Est-il possible?
- Le PID du processus du serveur de lancement sera dans mon fichier pidfile?
- 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
Il n'est pas nécessaire d'utiliser 'cat':' echo $$>/var/run/pid/launch-server.pid' –
@ Dennis-Williamson - Bonne prise, merci. – Petriborg