Voglio scrivere uno script Shell (.sh
file) per ottenere un determinato ID processo. Quello che sto cercando di fare qui è una volta ottenuto l'ID del processo, voglio terminare quel processo. Sono in esecuzione su Ubuntu (Linux).
Sono stato in grado di farlo con un comando simile
ps -aux|grep Ruby
kill -9 <pid>
ma non sono sicuro di come farlo tramite uno script Shell.
Se stai per usare ps
e grep
, dovresti farlo in questo modo:
ps aux|grep r[u]by
Quelle parentesi quadre faranno in modo che grep salti la linea per il comando grep stesso. Quindi per usare questo in uno script fai:
output=`ps aux|grep r\[u\]by`
set -- $output
pid=$2
kill $pid
sleep 2
kill -9 $pid >/dev/null 2>&1
I backtick consentono di catturare l'output di un comando in una variabile Shell. Il set --
analizza l'output di ps in parole e $ 2 è la seconda parola sulla riga che risulta essere il pid. Quindi invii un segnale TERM, attendi un paio di secondi per Ruby per spegnersi, quindi uccidilo senza pietà se esiste ancora, ma butta via qualsiasi output perché il più delle volte uccide - 9 si lamenterà che il processo è già morto.
So di averlo usato senza le barre rovesciate prima delle parentesi quadre, ma in questo momento l'ho controllato su Ubuntu 12 e sembra richiederle. Questo probabilmente ha qualcosa a che fare con le molte opzioni di bash e la configurazione predefinita su diverse distribuzioni Linux. Spero che [e] funzionino ovunque, ma non ho più accesso ai server in cui so che ha funzionato senza una barra rovesciata, quindi non posso esserne sicuro.
Un commento suggerisce grep-v ed è quello che facevo prima, ma quando ho saputo della variante [], ho deciso che sarebbe stato meglio generare un processo in meno nella pipeline.
Per iniziare non è necessario eseguire un ps -aux | grep...
Il comando pidof
è molto meglio da usare. E quasi mai fare kill -9
vedi qui
per ottenere l'output di un comando in bash, usa qualcosa di simile
pid=$(pidof Ruby)
oppure usa pkill
direttamente.
opzione -v
è molto importante. Può escludere un'espressione grep
stessa
per esempio.
ps -w | grep sshd | grep -v grep | awk '{print $1}' to get sshd id
Questo funziona in Cygwin ma dovrebbe essere efficace anche in Linux.
ps -W | awk '/Ruby/,NF=1' | xargs kill -f
o
ps -W | awk '$0~z,NF=1' z=Ruby | xargs kill -f
Puoi usare il comando killall :
$ killall Ruby
È piuttosto semplice. Basta eseguire qualsiasi programma come questo: - x = gedit & echo $! questo ti darà il PID di questo processo. quindi esegui questa uccisione -9 $ x