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?

DerMike
fuente
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
2
Por favor, consulte Gestión de procesos .
Pausado hasta nuevo aviso.

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.

Jeremy Sturdivant
fuente
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.

usuario1686
fuente