Bash skrip untuk menemukan dan membunuh proses dengan argumen tertentu?

17

Saya ingin skrip yang membunuh instance sshyang dijalankan dengan argumen -D (menyiapkan proxy lokal).

Secara manual, saya lakukan ps -A | grep -i ssh, cari instance dengan -D, dan kill -9 {id}masing - masing.

Tapi seperti apa bentuk bash script itu?

(Saya menggunakan Mac OS X tetapi akan menginstal perintah yang diperlukan melalui port)

Ricket
sumber
Lihat alternatif pgrep dan pkill di mac os x? . pgrepdan pkillmerupakan perintah untuk secara andal menemukan atau membunuh proses dengan nama di bawah Solaris dan Linux.
Gilles 'SO- stop being evil'

Jawaban:

26

Jalankan pgrep -f "ssh.*-D"dan lihat apakah itu mengembalikan ID proses yang benar. Jika ya, cukup ubah pgrepke pkilldan pertahankan pilihan dan pola yang sama

Juga, Anda tidak boleh menggunakan kill -9alias SIGKILL kecuali benar-benar diperlukan karena program tidak dapat menjebak SIGKILL untuk membersihkan sendiri sebelum mereka keluar. Saya hanya menggunakan kill -9setelah mencoba -1 -2dan -3.

SiegeX
sumber
Anda harus mendefinisikan kembali kill sebagai forloop yang cocok kill -iuntuk masing-masing i;)
Seamus
1
pgrepbukan asli pada OSX, Anda harus mendapatkannya dari pihak ketiga. Utas sebelumnya pada topik memiliki proposal dan alternatif.
Gilles 'SO- stop being evil'
manusia hidup, semakin aku menggunakan 'nix, semakin aku menyukainya :) terima kasih untuk ini!
javamonkey79
pgrep dan pkill tersedia di OS X 10.8 (Mountain Lion) dan di atasnya. apple.blogoverflow.com/2012/07/...
Peter Hanley
Mungkin bermanfaat untuk menambahkan -aflag pgrepyang membuatnya mencetak tidak hanya id proses tetapi juga perintah (termasuk argumen). Dengan cara ini sangat mudah untuk memverifikasi bahwa hanya proses yang diinginkan yang cocok.
luator
1

Juga,

kill `pgrep -f "ssh.*-D"`
Barun
sumber
3
Saya pikir ini setara denganpkill
Michael Mrozek
0

Anda dapat memanfaatkan sistem file proc untuk mengumpulkan informasi. Sebagai contoh:

for proc in $(grep -irl "ssh.*-D" /proc/*/cmdline | grep -v "self"); do if [ -f $proc ]; then cat $proc && echo ""; fi; done

Itu tidak sempurna, Anda akan menginginkan regex yang lebih eksklusif (terutama jika Anda mematikan proses) tetapi echo $proc | awk -F'/' '{ print $3 }'akan menunjukkan kepada Anda PID dari proses tersebut.

Tok
sumber
1
OSX tidak punya /proc. Dan sudah ada alat yang kuat untuk melakukan ini di luar sana, yang disebut pgrep(tersedia secara native setidaknya di Solaris dan Linux).
Gilles 'SANGAT berhenti menjadi jahat'