¿Cómo obtener el pid del último comando ejecutado en un script de shell?

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

El PID del último comando ejecutado está en el $! variable de shell:

my-app & echo $! 

Comentarios

  • Está imprimiendo pid como por ejemplo. [1] 893. Solo quiero un número.
  • Cabe señalar que esto significa programas iniciados en segundo plano . Si no se han iniciado procesos en segundo plano, el parámetro no está configurado.
  • Se sugiere otra solución valiosa en (un comentario a una respuesta a) Cómo obtener pid del proceso recién iniciado : oh, y el " delineador ": /bin/sh -c 'echo $$>/tmp/my.pid && exec program args' & – sysfault 24 de noviembre ' 10 a las 14:28
  • @ user3153014 String s como " [2] 2625 " se imprimen por shell después de iniciar la tarea en segundo plano. Esto no está relacionado con la salida de echo $!
  • Normalmente utilizo dicho código en un script cuando necesito esperar hasta que finalice el proceso. my-app & myVar=$! ; fg. fg trae el proceso a primer plano nuevamente. Luego puedo imprimir echo $myVar más tarde y ' estoy bastante seguro de que mi aplicación ya ha finalizado.

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.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *