Pregunta

NOTA:. Pensé que estaba usando bash, pero / bin / sh está vinculado a / bin / tablero, que tiene este problema Exec raro

Tengo un simple script de shell bash en Linux que se utiliza para poner en marcha un proceso de servidor (que no he escrito o control) y me gustaría tener la salida del script de shell bash PID del proceso iniciado a un archivo pid.

El problema es que de comandos bash-exec no reemplaza a su propio proceso con el proceso del servidor en marcha!

Así que:

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

Esto hace no trabajo porque el pid en el fichero será el de la fiesta no el proceso del servidor. Y si se cierra el proceso de servidor fiesta no puede salir dejando la secuencia de comandos de lanzamiento estúpida salir en la lista de procesos.

¿Alguien sabe una manera de utilizar fiesta de modo que (o un guión tal vez?):

  1. ¿Es posible?
  2. PID del proceso del servidor-servidor será lanzado en mi pidfile?
  3. Asegúrese de que la escritura del golpe morirá cuando existe el servidor en marcha y no deja procesos de concha difuntos salir en la lista de procesos?

Editar: Este fragmento de la fiesta de referencia manual sea de utilidad ...

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

Si se suministra comando, se sustituye el intérprete sin crear un nuevo proceso. Si la opción -l se suministra, la cáscara coloca un guión al principio del argumento pasado a cero del sistema. Esto es lo que hace el programa de inicio de sesión. Las causas opción -c comando a ejecutar con un entorno vacío. Si -a se suministra, la cáscara pasa nombre que el argumento de orden cero a comandos. Si no se especifica ningún comando, redirecciones se pueden utilizar para afectar el medio ambiente shell actual. Si no hay errores de redirección, el estado de salida es cero; de lo contrario el estado de retorno es distinto de cero.


Editar 2: Este es el guión (desinfectados):

#!/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

Y algunos ps de salida a tal ser más claro?

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
¿Fue útil?

Solución

¿Su distribución incluye start-stop-daemon(8)? pequeña herramienta maravillosamente útil, que fue construido específicamente para demonios que arrancan desde los scripts de shell. (Por supuesto, los demonios sobreviven a los scripts de shell, por lo que no puede ser una coincidencia perfecta - que depende de por qué desea la cáscara para sobrevivir a su demonio.)

O, algo más simple:

Podría su problema se resuelve con el comando exec de Bash? Sustituye el proceso de shell con cualquier programa que pida efectuar:

#!/bin/bash

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

$ ./show_exec.sh 
[nothing happens]

Y, en otra línea de comandos:

$ 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

Otros consejos

Ahora se dan cuenta lo que el real problema era:

Mediante el uso de #!/bin/sh no estaba invocando fiesta, pero el tablero.

exec de Dash es la cáscara con el problema exec. Si hubiera utilizado #!/bin/bash desde el principio, habría funcionado como se esperaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top