2011-04-24 8 views
5

Mi Makefile ser algo como esto:Conseguir última PID del proceso, en el Makefile

setsid ./CppServer>daemon.log 2>&1 & 
echo $!>daemon.pid 

Lo que espero que haga es almacenar el PID del my_awesome_script en el archivo correspondiente. Sin embargo, no hay nada allí. Entonces, ¿dónde está el problema?

Respuesta

4

Si su archivo MAKE realmente se ve así, obtendrá un error, porque no veo ninguna sintaxis real, solo la sintaxis del shell. Sin embargo, mi bola de cristal me dice que estas dos líneas podrían ser parte de la receta de una regla. Si lo son, debes darte cuenta de cómo make ejecuta recetas; para cada línea se crea una subshell separada, en la que el comando de esa línea se ejecuta de forma independiente: sus dos comandos no saben nada sobre el entorno de cada uno. Si desea que se ejecuten dos comandos en la misma subcadena, debe emitirlos como una línea (utilizando caracteres de continuación de línea, si es necesario), o usar la directiva ONESHELL de make.

+1

Eso no es útil. Dime: ¿por qué es $! ¿vacío cuando se le preguntó en Makefiles? – nalply

+2

@nalply: está vacío porque make no define una variable con ese nombre. Si desea usarlo en el intérprete de comandos, debe escapar del signo de dólar: '$$!', Pero debe tener en cuenta mi observación sobre cómo emitir los comandos en una línea, separados por, por ejemplo, un punto y coma – eriktous

+0

@eriktous excelente respuesta, definitivamente útil. Tuve el problema de nalply siguiente, ¡por supuesto el $$! resuelve eso. – David

0

La variable que está intentando usar imprime el pid del último programa ejecutado en segundo plano. Está escrito correctamente como echo $! > filename.extension. Pero dado que lo estás ejecutando en la delantera, tienes dos opciones. Ejecútelo en segundo plano agregando un & al final de la línea ./script_to_run &, o puede hacer que el script se imprima para archivar el pid del proceso actualmente en ejecución utilizando echo $$> filename.extension (dentro del script) Aquí hay un enlace que podría ayudarlo http://tldp.org/LDP/abs/html/internalvariables.html

+0

No es necesario agregar $ adicionales al frente de las variables internas. – rubixibuc

+0

Lo siento, el contenido del archivo MAKE que proporcioné en la pregunta no era como en el archivo MAKE real (lo hice ejecutar el script en el fondo). Ahora es sin embargo. – Alex

+0

Estoy ejecutando un programa, no un script, y estoy anexando & a la invocación. ¡Pero $! todavía está vacío. ¿Y ahora que? :-) – nalply

Cuestiones relacionadas