risposta-alla-domanda-sullo-sviluppo-web-bd.com

Script della shell per ottenere l'ID del processo su Linux

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.

27
sameera207

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.

18
Michael Dillon

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.

6
Fredrik Pihl

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
4
user2223691

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

Insidie ​​di Bash

3
Steven Penny

Puoi usare il comando killall :

$ killall Ruby
2
Francisco R

È 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

0
abhishekrana