2009-06-04 20 views
7

Ho un problema molto semplice: quando eseguo uno script di shell, avvio un programma che esegue in un ciclo infinito. Dopo un po 'voglio interrompere questo programma prima che possa di nuovo con parametri diversi. La domanda ora è: come posso scoprire il pid di il programma quando lo eseguo? Fondamentalmente, voglio fare qualcosa del genere:Processo di uccisione in Shell Script

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

Grazie!

risposta

0
killall app1 
2

si ottiene il pid di app1 con

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

e allora si dovrebbe essere in grado di ucciderlo .... (però, se hai diverse istanze di app1, si può uccidere' em all)

5

In bash $! si espande nel PID dell'ultimo processo avviato in background. Così si può fare:

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

Grazie per tutte le risposte, ma questo qui è il mio preferito! –

15

Nella maggior parte delle shell (tra cui Bourne e C), il PID dell'ultimo sottoprocesso si lanciato in background saranno conservati nella variabile speciale $ !.

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

C'è some information here nella sezione Variabili speciali.

3

se si vuole scoprire il PID di un processo, è possibile utilizzare ps:

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

il parametro -o pid dice che si desidera solo il PID del processo, -C app1 specifica il nome di il processo che si desidera interrogare e il parametro h viene utilizzato per sopprimere l'intestazione della tabella dei risultati (senza di essa, si vedrà un'intestazione "PID" sopra il PID stesso). non che se c'è più di un processo con lo stesso nome, verranno mostrati tutti i PID.

se si vuole uccidere questo processo, si potrebbe desiderare di utilizzare:

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

anche se killall è più pulita se si desidera solo per fare questo (e se non ti dispiace aver ucciso tutti i processi "App1"). è inoltre possibile utilizzare head o tail se si desidera rispettivamente solo il primo o l'ultimo PID.

e un suggerimento per gli utenti fish: %process viene sostituito con il PID di process. così, nel pesce, si può usare:

[email protected] ~> kill %app1 
0

ho avuto un problema in cui il processo mi stava uccidendo era uno script python e ho avuto un altro script che è stato anche in esecuzione pitone. Non volevo uccidere Python a causa dell'altro script.

ho usato awk a che fare con questo (lasciate che sia la vostra myscript script python): uccidere ps -ef|grep 'python myscript.py'|awk '!/awk/ && !/grep/ {print $2}'

potrebbe non essere il più efficiente ma preferirei commerciare efficienza per la versatilità in un compito come questo.

Problemi correlati