2009-06-04 21 views
7

Tengo un problema muy simple: cuando ejecuto un script de shell, comienzo un programa que ejecuta en un bucle infinito. Después de un tiempo, quiero detener este programa antes de que pueda de nuevo con diferentes parámetros. La pregunta ahora es ¿cómo puedo averiguar el pid del programa cuando lo ejecuto? Básicamente, quiero hacer algo como eso:Proceso de eliminación en Shell Script

echo "Executing app1 with param1" 
./app1 param1 & 
echo "Executing app1" 
..do some other stuff 
#kill somehow app1 
echo "Execution of app1 finished!" 

Gracias!

Respuesta

0
killall app1 
2

obtener el pid del app1 con

ps ux | awk '/app1/ && !/awk/ {print $2}' 

y entonces usted debería ser capaz de acabar con él .... (sin embargo, si usted tiene varias instancias de app1, puede matar' em all)

5

En bash $! se expande al PID del último proceso iniciado en segundo plano. Por lo que puede hacer:

./app1 param1 & 
APP1PID=$! 
# ... 
kill $APP1PID 
+0

Gracias por todas las respuestas, ¡pero esta es mi favorita! –

15

En la mayoría de los depósitos (incluyendo Bourne y C), el PID del último subproceso se puso en marcha en el fondo se almacenará en la variable especial $ !.

#!/bin/bash 
./app1 & 
PID=$! 
# ... 
kill $PID 

Hay some information here en la sección Variables especiales.

3

si desea averiguar el PID de un proceso, puede utilizar ps:

[[email protected] ~]$ ps h -o pid -C app1 

el parámetro -o pid dice que sólo desea que el PID del proceso, -C app1 especifica el nombre del el proceso que desea consultar, y el parámetro h se utiliza para suprimir el encabezado de la tabla de resultados (sin él, vería un encabezado "PID" encima del PID). no es que si hay más de un proceso con el mismo nombre, se mostrarán todos los PID.

si quieres matar a ese proceso, es posible que desee utilizar:

[[email protected] ~]$ kill `ps h -o pid -C app1` 

aunque killall es más limpia si lo que desea es hacer eso (y si no le importa matar todos los procesos "app1") también puede usar head o tail si solo desea el primer o último PID, respectivamente.

y una sugerencia para los usuarios de fish: %process se reemplaza con el PID de process. así, en el pescado, se puede utilizar:

[email protected] ~> kill %app1 
0

tuve un problema en el que el proceso estaba matando era un script en Python, y tenía otro guión que también estaba ejecutando pitón. No quería matar a Python debido a la otra secuencia de comandos.

que usa awk para hacer frente a este (el que sea su miscript script en Python): matar ps -ef|grep 'python myscript.py'|awk '!/awk/ && !/grep/ {print $2}'

Puede que no sea tan eficiente pero prefiere cambiar la eficiencia para una mayor versatilidad en una tarea como esta.

Cuestiones relacionadas