Come trovare PID di un comando di trattino-exec
-
26-09-2019 - |
Domanda
NOTA:. Ho pensato che stavo usando bash, ma / bin / sh è legata a / bin / dash, che ha questo problema exec strano
Ho un semplice script di shell bash su Linux che viene utilizzato per lanciare un processo server (che non ho scritto o controllo) e vorrei avere l'output bash script di shell PID del processo avviato a una pidfile.
Il problema è che il comando bash-exec non sostituisce il proprio processo con il processo server lanciato!
echo $$ | cat > /var/run/launched-server.pid
Questo non il lavoro perché il pid del file sarà quello di bash non il processo server. E se le uscite di processo di server bash non può uscire lasciando lo script di avvio stupido appendere fuori nella lista dei processi.
Qualcuno sa un modo per utilizzare in modo che bash (o un trattino forse?):
- E 'possibile?
- PID del processo server avviato-server sarà nel mio pidfile?
- Assicurarsi che lo script bash morirà quando esiste il server lanciato e non lasciare i processi di shell defunte appendere fuori nella lista dei processi?
Modifica: Questo frammento della bash riferimento manuale essere di uso ...
exec
exec [-cl] [-a name] [command [arguments]]
Se viene fornita comando, sostituisce il guscio senza creare un nuovo processo. Se l'opzione -l è fornita, la shell pone un trattino all'inizio dell'argomento zeroth passato al comando. Questo è ciò che il programma login fa. Le cause opzione -c comando da eseguire con un ambiente vuoto. Se -a viene fornito, il guscio passa nome come argomento zeresimo di comando. Se non viene specificato alcun comando, reindirizzamenti possono essere utilizzate per influenzare l'ambiente shell corrente. Se non ci sono errori di reindirizzamento, lo stato di ritorno è zero; altrimenti lo stato di ritorno è diverso da zero.
Modifica 2: Questo è lo script (sterilizzata):
#!/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
E alcuni di ps a forse essere più chiaro?
me@chainsaw: ~/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
Soluzione
La vostra distribuzione includono start-stop-daemon(8)
? Meravigliosamente utile piccolo strumento, è stato costruito appositamente per l'avvio di demoni da script di shell. (Naturalmente, i demoni sopravvivono gli script di shell, quindi potrebbe non essere una partita perfetta - dipende il motivo per cui si desidera che la shell di sopravvivere vostro demone.)
O, per qualcosa di più semplice:
Potrebbe il problema essere risolto con il comando exec
di bash? Esso sostituisce il processo di shell con qualunque programma che si chiede di eseguire:
#!/bin/bash
echo $$ > /tmp/pidfile
exec /bin/sleep 60
$ ./show_exec.sh
[nothing happens]
E, in un'altra 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
Altri suggerimenti
Ora mi rendo conto che cosa reale problema era:
Utilizzando #!/bin/sh
non ero invocare bash, ma trattino.
exec di Dash è la shell con il problema exec. Se avessi usato #!/bin/bash
fin dall'inizio, avrebbe funzionato come previsto.