Saat mereka berlari
Sepertinya Anda bisa melakukan ini dengan kill
dan output dari jobs -p
.
Contoh
$ sleep 1000 &
[1] 21952
$ sleep 1000 &
[2] 21956
$ sleep 1000 &
[3] 21960
Sekarang saya memiliki 3 pekerjaan palsu yang sedang berjalan.
$ jobs
[1] Running sleep 1000 &
[2]- Running sleep 1000 &
[3]+ Running sleep 1000 &
Bunuh mereka semua seperti ini:
$ kill $(jobs -p)
[1] Terminated sleep 1000
[2]- Terminated sleep 1000
[3]+ Terminated sleep 1000
Mengkonfirmasikan mereka semua pergi.
$ jobs
$
Ketika mereka berhenti
Jika Anda memiliki pekerjaan yang dihentikan, bukan menjalankan Anda sebagai gantinya.
Contoh
$ kill $(jobs -p)
$ jobs
[1]+ Stopped sleep 1000
[2]- Stopped sleep 1000
[3] Stopped sleep 1000
OK jadi itu tidak membunuh mereka, tapi itu karena sinyal mematikan tidak dapat ditangani oleh proses itu sendiri, itu berhenti. Jadi beritahu OS untuk melakukan pembunuhan sebagai gantinya. Itu untuk apa -9
.
$ kill -9 $(jobs -p)
[1]+ Killed sleep 1000
[2]- Killed sleep 1000
[3] Killed sleep 1000
Itu lebih baik.
$ jobs
$
Ketika beberapa berjalan dan beberapa dihentikan
Jika Anda memiliki kantong campuran proses di mana beberapa berhenti dan beberapa berjalan Anda dapat melakukan yang kill
pertama diikuti oleh a kill -9
.
$ kill $(jobs -p); sleep <time>; \
kill -18 $(jobs -p); sleep <time>; kill -9 $(jobs -p)
Perpanjang waktu sedikit jika Anda membutuhkan lebih banyak untuk memungkinkan proses untuk menghentikan diri mereka sendiri terlebih dahulu.
Sinyal
HUP (-1) atau SIGTERM (-15) untuk dibunuh tidak akan berhasil. Tapi kenapa? Itu karena sinyal-sinyal ini lebih ramah dalam arti mereka memberitahu aplikasi untuk menghentikannya sendiri. Tetapi karena aplikasi dalam keadaan berhenti itu tidak dapat memproses sinyal-sinyal ini. Jadi Anda hanya menggunakan SIGKILL (-9).
Anda dapat melihat semua sinyal yang kill
disediakan kill -l
.
$ kill -l | column -t
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
Jika Anda ingin mempelajari lebih lanjut tentang berbagai sinyal, saya sangat menyarankan seseorang untuk melihat halaman manual sinyal man 7 signal
,.
+
simbol untuk proses pertama dan-
simbol untuk proses kedua dan tidak ada simbol di proses ketiga?terminate
bukannyakill
, karena saya sudah membaca yang lebih aman. Saya mencobakill -15 $(jobs -p)
, tetapi itu tidak berpengaruh. Saya menduga bahwa proses yang terhenti hanya dapat dimatikan, tetapi sekali lagikill %number
menghentikan proses (individu) yang terhenti.+
dan-
hanya proses terakhir yang saya sentuh ketika saya menyiapkan contoh. The+
berarti bahwa setiap perintah yang tidak secara eksplisit termasuk%#
akan bertindak atas perintah itu. Tanda hubung (-
) adalah perintah ke-2 hingga terakhir yang saya sentuh.kill -9 ..
seharusnya sudah berfungsi. apa prosesnya? Apakah prosesnya mati atau yatim?Anda bisa mencoba ini.
Namun, jika Anda ingin menghentikan proses, Anda dapat mengeluarkan perintah sebagai,
Dari halaman Wiki
Kill
perintah ,Suatu proses dapat mengirim sinyal SIGTERM dalam empat cara (ID proses adalah '1234' dalam kasus ini):
Proses dapat mengirim sinyal SIGKILL dalam tiga cara:
Seperti yang dijelaskan dalam jawaban ini , ini adalah perbedaan antara mengakhiri dan membunuh .
Sinyal terminasi, SIGTERM , adalah sinyal yang dapat dicegat dalam suatu program. Seringkali proses yang dimaksudkan untuk berjalan di latar belakang akan menangkap sinyal ini dan memulai proses penonaktifan, menghasilkan jalan keluar yang bersih. Sinyal bunuh, SIGKILL , tidak dapat dicegat. Ketika ini dikirim ke suatu proses, itu akan mengakibatkan penghentian mendadak dari program itu.
Ketika Anda mematikan atau menyalakan ulang komputer Anda misalnya, biasanya SIGTERM dikirim ke proses yang berjalan terlebih dahulu yang memungkinkan mereka keluar dengan cara yang bersih jika mereka mendukungnya. Kemudian, setelah beberapa detik SIGKILL dikirim ke proses yang masih berjalan sehingga sumber daya yang digunakan dilepaskan secara paksa (misalnya file yang digunakan) dan urutan pematian dapat dilanjutkan (mis. Unmount sistem file).
sumber
kill
setiap proses latar belakang. Namun, apakah ada cara lain bagiterminate
mereka, karena saya percaya itu lebih aman?-15
perintah kill.-15
juga tidak akan bekerja di sini. Lihat A. sayakill -9
dalam contoh saya tidak akan berhasil.Ok, bermain-main dengan ini saya melihat bahwa ketika Anda membunuh pekerjaan yang dihentikan (di mana eksekusi telah dijeda tetapi tidak dihentikan), maka itu tidak akan selesai sampai dibawa ke latar depan. Program biasanya dihentikan dengan menekan Ctrl- Zpada terminal. Sebagian besar terminal mengirim
SIGSTOP
dalam hal ini, tetapi tentu saja ada juga cara lain untuk mengirimkannya seperti dengankill -STOP
ataukill -19
.Ini adalah perilaku normal untuk program tidak menyelesaikan segera karena program harus berjalan untuk memproses
SIGTERM
sinyal default yang dikirim olehkill
. Selain itu, kadang-kadang setelahbash
mengirimSIGTERM
ke proses latar belakang, entah bagaimana akhirnya terhenti (meskipunSIGTERM
masih tertunda).Cara teraman untuk menyelesaikan semua pekerjaan ( tanpa terpaksa
kill -9
) pertama-tama adalah mengirimSIGTERM
dengan normalkill
, kemudian mengirimSIGCONT
ke pekerjaan yang tersisa, misalnya:The
SIGCONT
(18
adalah jumlah sinyal) akan membawa setiap pekerjaan berhenti menjadi latar depan sehingga mereka dapat memprosesSIGTERM
karena mereka biasanya.Jika semua program tidak selesai dengan ini, maka ada beberapa sinyal lain yang dapat Anda coba yang biasanya membuat proses selesai, sebelum beralih ke
kill -9
. Yang pertama saya sarankan adalahSIGHUP
karena banyak program yang biasanya memblokir sinyal terminasi lainnya meresponsSIGHUP
. Ini biasanya dikirim ketika terminal pengendali ditutup, khususnya dikirim ketikassh
sesi dengantty
selesai. Banyak program interaktif, seperti shell, tidak akan menanggapi sinyal terminasi lain tetapi akan melakukan hal ini karena akan menjadi masalah bagi mereka untuk tetap berjalan setelahssh
sesi selesai (atau setelah terminal pengendali ditutup). Untuk mencoba ini Anda bisa melakukannyaSekali lagi tentu saja Anda perlu memastikan program tidak berhenti sehingga dapat memproses sinyal. Sinyal terminasi lain yang dapat Anda coba adalah
SIGINT
(kill -2
) danSIGQUIT
(kill -3
). Tapi tentu saja manfaat dari mencoba berbagai berkurang dan dapat menyebabkan tak terhindarkanSIGKILL
(aliaskill -9
).sumber
man signal
Anda bisa mendapatkan bahan referensi untuk mendukung ini.kill -9 ..
metode ini akan bekerja dalam banyak kasus. Ini kadang-kadang akan meninggalkan proses berkeliaran, sehingga akan gagal lebih banyak waktu. Ini adalah trade off yang harus Anda putuskan. Lebih baik menjadi tangan berat dan membunuh segalanya, mempertaruhkan data / pembersihan vs memiliki pembersihan lebih lembut, tetapi harus melakukan lebih banyak analisis karena pembunuhan Anda semakin keras.kill -9
sedapat mungkin karena ini hanya menarik steker tanpa memberi program kesempatan untuk membersihkan dengan benar. Saya akan memperbarui dengan beberapa alternatif.kill ..; sleep <time>; kill -18 ..
; tidur <waktu>; bunuh -9 .... Basically working up to the
-9`.kill -18
itu pasti sesuatu yang harus digunakan karena sudah umum berhenti pekerjaan (dan dalam beberapa kasus tampaknyabash
entah bagaimana berhenti menjalankan pekerjaan sebelum mengirimSIGTERM
). Seperti yang ditambahkan di atasSIGHUP
juga patut dicoba karena banyak program yang tidak menanggapi yang lain akan menanggapi ini (coba dengan shell). Di luar itu, ya, itu tidak begitu berharga karenaSIGKILL
mungkin tidak bisa dihindari.Ini akan menghentikan semua pekerjaan di shell Anda saat ini satu per satu:
Penjelasan:
%
mengacu pada pekerjaan terakhir dalam daftar, sehingga akan berulang hinggakill
mengembalikan nilai bukan nol, yang berarti tidak ada lagi pekerjaan yang harus diberhentikan.Pendekatan lain mungkin adalah pengiriman pertama
SIGTERM
, makaSIGCONT
agar pekerjaan Anda dapat dilanjutkan dan hal pertama yang akan mereka lakukan adalah menerima AndaSIGTERM
.(untuk beberapa alasan built-in
kill
aneh, jadi saya menggunakan yang eksternal di sini).sumber