Bagaimana cara membunuh hanya jika proses sedang berjalan?

14

Saat ini saya menggunakan baris seperti ini di file skrip sh saya:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

Tapi saya ingin tahu bagaimana menyebutnya hanya jika proses (di myServersini) berjalan?

myWallJSON
sumber
tidak mungkin untuk memanggil killhanya ketika proses sedang berjalan, karena ada kondisi perlombaan antara tes dan doa kill(mungkin proses berhenti karena alasan lain dalam waktu singkat). Anda harus menggunakan pkillatau killallyang melakukan persis sama dengan apa yang Anda coba lakukan, tetapi dengan kurang mengetik (dan mungkin beberapa kelebihan lainnya juga).
JanC

Jawaban:

20

Saya biasanya hanya menggunakan pgrep dan pkill

if pgrep myServer; then pkill myServer; fi
boutch55555
sumber
7
Mengapa tidak pkill myServeratau killall -q myServer? Tidak ada kerugian untuk mencoba membunuh proses yang tidak ada.
David Foerster
12
Itu tidak akan keluar dari 0 jika tidak ada proses untuk membunuh, sehingga itu bisa merusak skrip.
boutch55555
6
Tambahkan || truekemudian.
David Foerster
Benar, tetapi Anda tidak akan memiliki fleksibilitas untuk menambahkan yang lain untuk memberi tahu Anda bahwa prosesnya sudah mati.
boutch55555
Bagaimana dengan if ! killall -q myServer; then echo ERROR; fi?
David Foerster
9

Anda dapat membunuh proses dengan nama menggunakan pkillatau killall, periksa halaman manual mereka.

enzotib
sumber
ya, tidak seperti kill, ini hanya membunuh jika proses sedang berjalan. Misalnyapkill -u myuser -f myprocess\.[0-9]+
Chase T.
6

Sedikit pendekatan yang berbeda akan menjadi seperti ini:

killall PROCESS || echo "Process was not running."

Ini akan menghindari 1Kode-Kesalahan yang dikembalikan dari killallperintah, jika prosesnya tidak ada. Bagian echohanya akan bertindak, jika killallkembali 1, sementara itu sendiri akan kembali 0(sukses).

codepleb
sumber
5
Menggunakan killall -qlebih baik
Anwar
1
Peringatan, killall -qtidak didukung pada semua rasa unix, macOS Catalina masih belum memilikinya.
tresf
0

coba gunakan:

sudo kill `pidof process_name`

di mana process_name adalah nama proses yang ingin Anda bunuh. Apa yang hebat tentang ini adalah bahwa pidof akan mendaftar pid dari semua proses yang cocok dengan nama yang diberikan. Karena membunuh menerima beberapa pid, itu akan membunuh mereka semua dalam satu tingkah.

Beri tahu saya jika ini membantu.

amandion
sumber
Bagaimana jika daftar itu kosong? (Poin utama saya adalah tidak memanggil kill sama sekali jika mungkin)
myWallJSON
1
Jika daftar kosong, kill akan mengembalikan kode kesalahan 1 dan tidak membunuh apa pun. Ini akan sama dengan mencoba memanggil kill tanpa argumen. Anda bisa menambahkan pernyataan if yang pertama kali memeriksa apakah pidof mengembalikan daftar kosong. Jika tidak mengembalikan daftar kosong, hubungi kill `pidof process_name. Jika itu mengembalikan daftar kosong, lewati panggilan bunuh.
amandion
0

Naskah Kecil yang saya buat dengan R&D. Saya harap Anda akan menyukainya

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

simpan dengan beberapa nama seperti script.sh lalu

chmod +x script.sh
./script.sh

Kemudian berikan nama proses Anda.

Catatan: Saya sudah mencoba berkali-kali dengan ini dan baik-baik saja.

rɑːdʒɑ
sumber
Bolehkah saya tahu apa yang salah dengan skrip ini dan tolong beri saya penjelasan.
rɑːdʒɑ
Tidak ada yang salah dengan skrip ini ... +1
WinEunuuchs2Unix
0

Periksa apakah ada proses dengan pidof. Jika ya, bunuhlah:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

Kode keluar selalu 0 setelah menjalankan perintah di atas.

Juuso Ohtonen
sumber
0

Gunakan pkilldengan opsi-f

pkill -f myServer

Opsi -fadalah pola yang biasanya cocok dengan nama proses.

Chase T.
sumber
-1

Saya akan menggunakan:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

The xargs -rmemberitahu untuk menjalankan membunuh hanya jika ada masukan. The ps --no-header -eo pid,cmdmendapat output ke format yang lebih baik untuk parsing.

Arcege
sumber