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?):

  1. E 'possibile?
  2. PID del processo server avviato-server sarà nel mio pidfile?
  3. 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
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top