Pertanyaan Bagaimana saya bisa membunuh semua pekerjaan yang dihentikan?


Ketika saya mencoba untuk keluar dari server Linux saya, saya mendapatkan pesan:

Ada pekerjaan yang dihentikan.

: Apakah ada satu perintah untuk membunuh ini?


80
2018-02-25 10:07




Contoh tambahan dalam U & L Q & A: unix.stackexchange.com/questions/124428/… - slm
Saya memiliki masalah yang berlawanan sekarang, itu tidak akan memperingatkan tentang pekerjaan yang dihentikan ketika saya keluar dari shell! Harus meletakkan shopt -s checkjobs di .bashrc saya - Sam Watkins
tekan ctrl + d lagi, itu akan membiarkan Anda keluar sekarang, membunuh pekerjaan-pekerjaan itu dalam prosesnya - Jens Timmerman


Jawaban:


Untuk segera membunuh semua pekerjaan yang berjalan di bawah bash, masukkan:

kill `jobs -ps`

jobs -ps daftar ID proses dari pekerjaan yang dihentikan. kill `jobs -ps` kirim sinyal TERM ke semua pekerjaan yang dihentikan.


69
2018-02-25 10:15



-1 untuk "kill Jobs" - Tibor
tidak berfungsi ketika pekerjaan itu "sudo su". yaitu sudo kill `jobs -p` tidak berfungsi tetapi secara eksplisit mengetik PID. - user13107
Mengapa ini sangat disukai? Itu salah. Jika proses dihentikan, maka a kill seperti ini tidak akan melakukan apa-apa, karena proses dihentikan, mereka tidak akan memproses SIGTERM (-15) yang dikirimkan kepada mereka secara default. - slm
kill -9 akan melakukan trik. - Blossoming_Flower
Jawaban yang salah jelas! - mrangry777


Coba ketikkan ini:

kill -9 $(jobs -p)

76
2018-02-25 10:14



Itu harus dilakukan, tapi saya pikir dia harus mengirim terlebih dahulu SIGTERM (-15) sebelum mengirim SIGKILL (-9). Jadi mungkin mengusulkan sesuatu seperti "kill $ (jobs -p); sleep 3s; kill -9 $ (jobs -p)" akan lebih baik. Mengirim SIGTERM pertama pekerjaan mungkin dapat melakukan exit bersih (membebaskan sumber daya yang dialokasikan, dll). - rems
Kevin Duke, jawaban Anda adalah yang berhasil bagi saya. Saya tidak dapat memilih karena saya tidak memiliki reputasi 15. kill -9 $ (pekerjaan -p)
@rems Kecuali, sebagai slm menunjukkan, mereka tidak akan mendapatkan SIGTERM karena mereka berhenti. - Paul Gear
Tidak berfungsi pada zsh. Disebabkan oleh zsh tidak menjadi POS  IX sesuai dengan pekerjaan. - Max Coplan


Jawaban yang diterima akan membunuh semua pekerjaan (yang cukup dalam kasus ini) dan bukan hanya yang berhenti. Jika Anda ingin membunuh hanya yang Berhenti, jalankan:

kill $(jobs -l | grep Stopped | cut -d' ' -f3)

16
2018-03-08 18:04



grep / cut dapat digabungkan dalam satu perintah awk: awk '/Stopped/{print $3}') - laebshade
itu -s argumen tentang jawaban yang diterima hanya memfilter yang berhenti - 79E09796


Cara termudah adalah dengan segera mencoba kembali keluar; bash akan menganggap itu berarti "bunuh semua pekerjaan yang dihentikan dan keluar".


12
2018-03-08 18:13



Itu akan mengirim HUP yang tidak selalu menghentikan pekerjaan apa pun. - Stephen Niedzielski


for x in `jobs -p` ; do kill -9 $x ; done

7
2018-02-26 10:22



Anda dapat menambahkan pemformatan kode untuk baris ini agar lebih mudah dibaca. - drcelus
Dapatkah Anda melihat kembali pemformatan Anda - gunakan empat spasi di awal baris untuk menandai blok sebagai kode (daripada menggunakan backtick). Saat ini tidak jelas apakah Anda menggunakan backticks di kode Anda, atau mencoba menampilkan kode menggunakan backticks. - dunxd
Formatnya bagus. kita harus meneruskan pekerjaan -p menggunakan backticks yang lain tidak akan dianggap sebagai perintah, dan itu akan melemparkan kesalahan. - monu


Jika Anda ingin menghapus beberapa pekerjaan yang dihentikan tetapi tidak semua, coba ini:

Pertama, daftar pekerjaan, Anda akan mendapatkan sesuatu seperti ini:

$ jobs -l

[2]   4813 Stopped                 ./parse < call.txt
[3]-  4819 Stopped                 ./parse < call.txt

kirim kill ke pekerjaan yang dihentikan, itu tidak akan melakukan apa-apa kecuali mengantri daripada membawanya di latar depan, itu akan berakhir

$ fg %2
./parse < call.txt
Terminated

$ jobs -l
[3]-  4819 Stopped                 ./parse < call.txt

4
2018-05-30 04:16





Biasanya jika Anda mendapat pesan itu, Anda harus logout dua kali. Misalnya. pertama Ctrl + D memberi Anda pesan peringatan untuk memberi tahu Anda tentang penghentian pekerjaan, menekan untuk kedua kalinya akan membuat Anda keluar dari pekerjaan. Ini juga berlaku untuk logout dan exit perintah.

Untuk membunuhnya secara manual, coba: kill $(jobs -p).


Jika Anda tidak ingin membunuh pekerjaan dari shell Anda saat ini, Anda dapat menghapusnya dari tabel pekerjaan aktif tanpa membunuh dengan menggunakan disown perintah. Misalnya.

$ sleep 1000 &
[1] 19404
$ jobs
[1]+  Running                 sleep 1000 &
$ disown

Pekerjaan yang dihentikan juga dapat ditentukan oleh keadaan proses (T karakter) yang berarti proses dihentikan oleh sinyal seperti SIGSTOP, SIGTSTP atau lainnya (suka SIGTTIN, atau SIGTTOU).

Dalam hal kapan jobs perintah shell builtin tidak tersedia, proses yang dihentikan dapat dicantumkan dengan perintah berikut:

ps wuax | awk '$8 ~ "T"'

Untuk membunuh mereka semua, pada dasarnya Anda dapat mengetik:

kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')

Berikut ini adalah tes sederhana:

$ sleep 1000 &
[1] 2014
$ sleep 1000 &
[2] 2015
$ sleep 1000 &
[3] 2016
$ sleep 1000 &
[4] 2017
$ killall -STOP sleep
[1]   Stopped                 sleep 1000
[2]   Stopped                 sleep 1000
[3]   Stopped                 sleep 1000
[4]   Stopped                 sleep 1000
$ ps wuax | awk '$8 ~ "T"'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
vagrant   2014  0.0  0.0   7228   832 pts/0    T    20:38   0:00 sleep 1000
vagrant   2015  0.0  0.0   7228   708 pts/0    T    20:38   0:00 sleep 1000
vagrant   2016  0.0  0.0   7228   760 pts/0    T    20:38   0:00 sleep 1000
vagrant   2017  0.0  0.0   7228   828 pts/0    T    20:38   0:00 sleep 1000
$ kill -9 $(awk 'NR>1 && $8 ~ "T" {print $2}' <(ps wuax))
$ jobs
[1]   Killed                  sleep 1000
[2]   Killed                  sleep 1000
[3]   Killed                  sleep 1000
[4]   Killed                  sleep 1000

4
2018-02-19 20:46





Hanya dalam kasus ini membantu orang lain - kebanyakan orang ada di sini karena mereka memiliki beberapa proses berhenti yang mereka mulai, di-background melalui shell mungkin. Saya perlu menemukan proses, sebagai root, dihentikan oleh pengguna lain, untuk varian mana di jobs perintah tidak akan dilakukan.

Sedikit menggali dengan man ps membuat saya menjadi seperti ini:

ps -a -o pid,user,cmd,state | grep 'T$'

Penjelasan: -a bendera mengatakan menunjukkan semua proses, lalu -o mengontrol output, info apa yang akan ditampilkan tentang setiap proses. Saya memilih pid, user, cmd (baris perintah), dan state, yang merupakan keadaan proses.

Dari man ps:

PROCESS STATE CODES
   Here are the different values that the s, stat and state output specifiers (header "STAT" or "S") will display to describe the
   state of a process:
           D    uninterruptible sleep (usually IO)
           R    running or runnable (on run queue)
           S    interruptible sleep (waiting for an event to complete)
           T    stopped, either by a job control signal or because it is being traced
           W    paging (not valid since the 2.6.xx kernel)
           X    dead (should never be seen)
           Z    defunct ("zombie") process, terminated but not reaped by its parent

jadi akhirnya saya menyambungkannya grep T$ yang mengatakan, tunjukkan saya semua proses yang memiliki T di kolom terakhir.

Dan kemudian saya memiliki daftar yang bagus dari semua proses dari pengguna yang berbeda yang berada dalam keadaan berhenti.

$ ps -a -o pid,user,cmd,state | grep 'T$'
  865 joson74+ python                      T
  885 joson74+ sh -c less                  T
  886 joson74+ less                        T
 1014 minames+ python3.4 -i /home/minames  T
 5352 MooKo    nano stdio.h                T
 7851 harry    tmux attach                 T
12083 harry    tmux attach                 T
13495 gorylla+ python3.4 -i /home/gorylla1 T
18009 conr1d   vim                         T
19664 enythin+ python                      T
24906 wardlist python                      T

4
2018-02-26 06:47



Untuk menghentikan pekerjaan yang terkait dengan shell saat ini, jobs -ps lebih sederhana daripada jawaban ini. Yang sedang berkata, jawaban ini tidak hanya menunjukkan pekerjaan berhenti melalui Ctrl-Z dalam cangkang, tapi semua pekerjaan berhenti: cangkang lain, pengguna lain, termasuk pekerjaan yang dibebani (misalnya oleh gdb). - Stéphane Gourichon