Escribir un archivo PID manualmente desde el script Bash


10

¿Cómo podría escribir un script Bash que ejecute un programa de larga ejecución y almacene la identificación del proceso de los programas en un archivo separado?

Quiero algo como

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

Sin embargo, hacer exactamente esto ejecutaría la herramienta unaps vez que haya terminado.

¿Hay alguna manera de obtener la identificación del proceso creado?


2
Su código de muestra no funcionará porque exec no se bifurca, por lo que el proceso de shell se reemplaza por el long_running_toolproceso. En consecuencia, exec nunca regresa y nunca se alcanza la siguiente línea. Ver help exec, execve(2).
Etienne Dechamps

@ e-t172 gracias por señalarnos. Borro 'exec' entonces.
DerMike

Respuestas:


12

Puede ejecutar fácilmente el proceso en segundo plano con "&", luego obtener el PID del proceso en segundo plano usando "$!"

#!/bin/bash
long_running_tool &
echo $! > pid_file

Entonces, opcionalmente, ¡espera $! si desea que el shell se bloquee hasta que el proceso complete la ejecución.


1
ACTUALIZACIÓN: cuando uso el fg obtengo 'fg: 21: trabajo (nulo) no creado bajo control de trabajo' y el script no se bloquea. Lo siento.
DerMike

"espera $!" debería tener un efecto similar a fg que puedo confirmar, de hecho, funciona en un script. Probablemente debería haberlo comprobado antes de publicar. >.> mi mal.
Jeremy Sturdivant

9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Como se mencionó anteriormente, exec reemplaza bash con el programa especificado, conservando el PID.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.