2012-02-05 11 views
6

Tengo un Makefile que inicia un servidor web Django. Me gustaría que el servidor se inicie en segundo plano, con el PID guardado en un archivo.Capturar el PID de un proceso en segundo plano iniciado por un Makefile

Mi receta es el siguiente:

run: venv 
    @"${PYTHON}" "${APP}/manage.py" runserver 80 

Intuitivamente, a fondo el proceso y capturar el PID, que tendría que hacer algo como esto:

run: venv 
    @"${PYTHON}" "${APP}/manage.py" runserver 80 & ; echo "$$!" > "${LOGDIR}/django.pid" 

Esto no funciona , aunque. El sub-shell que 'hacer' usos (/ bin/sh en mi caso) funciona cuando se utiliza:

<command> & 

... a fondo un proceso, y funciona cuando el uso:

<command> ; <command> 

(o <command> && <command>, etc ...) para encadenar comandos. Sin embargo, cuando trato de fondo del primer proceso y la cadena de un segundo, me sale el siguiente error:

/bin/sh: -c: line 0: syntax error near unexpected token `;'

¿Cuál es la mejor manera de fondo de un proceso y capturar el PID en un Makefile?

Gracias
- B

+0

tengo curiosidad por qué estás usando 'make' para iniciar un servidor web? ¿Es esto una especie de suite de pruebas? ¡Buena suerte! – shellter

+0

@shelter: estoy trabajando en una aplicación web, y estoy usando un Makefile para proporcionar una forma rápida de iniciar un servidor web local, para fines de desarrollo y pruebas. – BillyBBone

Respuesta

17

acaba de salir de un solo signo, sin un punto y coma después de que:

run: venv 
    @"${PYTHON}" "${APP}/manage.py" runserver 80 & echo "$$!" > "${LOGDIR}/django.pid" 

Ampersand actúa como separador de comando en la misma forma que un punto y coma:

<command> & <command> 
+0

¡Aprendo algo nuevo todos los días! ¡Gracias! ;) – BillyBBone

+0

@Billy, en realidad, yo también. :) –

0

Si Make le da demasiado problema, siempre se puede tener la puesta en marcha de destino un script sh; en esa secuencia de comandos, inicie el proceso, el fondo y luego envíe el pid a un archivo.

+0

Esto podría funcionar, pero como un archivo MAKE es solo un conjunto de comandos de macro de shell, probablemente me encontraría con el mismo problema en mi script de shell. La solución debe adaptarse directamente al archivo MAKE en lugar de agregar otra capa de abstracción y dependencias. – BillyBBone

+0

Es cierto. Muchas veces trato de hacer que funcione en un script de shell primero, y luego migrarlo al Makefile. –

Cuestiones relacionadas