Quiero tener un script de shell como este:
my-app & echo $my-app-pid
Pero lo hago No sé cómo obtener el pid del comando recién ejecutado.
Sé que puedo usar el comando jobs -p my-app
para grep del pid. Pero si quiero ejecutar el shell varias veces, este método no funcionará. Porque la especificación de trabajo es ambigua.
Respuesta
Responder
Obtener PID
:
#!/bin/bash my-app & echo $!
Guarde PID
en la variable:
#!/bin/bash my-app & export APP_PID=$!
Guarde todas las instancias PID
en archivo de texto:
#!/bin/bash my-app & echo $! >>/tmp/my-app.pid
Guarde la salida, los errores y PID
en archivos separados :
#!/bin/bash my-app >/tmp/my-app.log 2>/tmp/my-app.error.log & echo $! >>/tmp/my-app.pid echo "my-app PID"s: $(cat /tmp/my-app.pid)"
Comentarios
- La pregunta no ' t pregunte acerca de la redirección, entonces su respuesta es casi la misma que la aceptada excepto que si una instancia de
my-app
finaliza, y quizás peor aún, su PID se reutiliza más tarde, ' habrá mala información en su archivo. No ' no creo que esta respuesta agregue mucho valor a la respuesta aceptada existente realmente - ¡Publicación de @EricRenouf actualizada!
- otro derivado que podría ser útil. Esto obtiene el PID y al mismo tiempo lo trata como un proceso (principalmente) en primer plano:
sleep 4 | grep INVALID & export MY_PID=$!; fg; echo $MY_PID returned with $?
` - no es APP =
main &
¿una forma de obtener PID?
Responder
Pruebe algo como
pidof my_app >> /tmp/my_app.pid
Comentarios
- comando externo, y lento, si el sistema puede dar PID directamente por qué buscar en todos los procesos para encontrar eso ? y también, ¿puede ' t estar seguro de que ' obtendrá el valor correcto
Responder
Intente algo como esto:
ps ef | grep "[m]y-app" | awk "{print $2}"
Colocando la primera letra de su proceso entre [
]
se asegura de que no obtenga el proceso grep
en su lista. Si es necesario, también puede agregar un grep en su nombre de usuario.
Comentarios
- Eso ' es muy frágil en el mejor de los casos y no ' no funciona si
my-app
se ejecuta más de una vez – davidshen84 se preocupa específicamente por eso cas. - Si incluso sigue esta ruta, debe usar
pgrep
en su lugar.
/bin/sh -c 'echo $$>/tmp/my.pid && exec program args' &
– sysfault 24 de noviembre ' 10 a las 14:28echo $!
my-app & myVar=$! ; fg
.fg
trae el proceso a primer plano nuevamente. Luego puedo imprimirecho $myVar
más tarde y ' estoy bastante seguro de que mi aplicación ya ha finalizado.