Ketika saya mencoba keluar dari server Linux saya, saya mendapatkan pesan:
Ada pekerjaan yang berhenti.
: Apakah ada satu perintah untuk membunuh ini?
shopt -s checkjobs
.bashrc saya
Ketika saya mencoba keluar dari server Linux saya, saya mendapatkan pesan:
Ada pekerjaan yang berhenti.
: Apakah ada satu perintah untuk membunuh ini?
shopt -s checkjobs
.bashrc saya
Jawaban:
Untuk dengan cepat membunuh semua pekerjaan yang dihentikan di bawah bash, masukkan:
kill -9 `jobs -ps`
jobs -ps
daftar ID proses ( -p
) dari pekerjaan yang dihentikan ( -s
).
kill -9 `jobs -ps`
mengirimkan sinyal SIGKILL ke semuanya.
sudo kill `jobs -p`
tidak bekerja tetapi secara eksplisit mengetik PID berhasil.
kill
seperti ini tidak akan melakukan apa-apa, karena proses dihentikan, mereka tidak akan memproses SIGTERM (-15) yang dikirim kepada mereka secara default.
Coba ketikkan ini:
kill -9 $(jobs -p)
Jawaban yang diterima akan mematikan semua pekerjaan (yang cukup dalam kasus ini) dan bukan hanya yang berhenti. Jika Anda ingin hanya membunuh yang Berhenti, jalankan:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
awk '/Stopped/{print $3}')
-s
argumen pada filter jawaban yang diterima hanya yang berhenti
Cara termudah sebenarnya adalah dengan segera mencoba kembali pintu keluar; bash
akan menganggap itu berarti "bunuh semua pekerjaan yang berhenti dan keluar".
for x in `jobs -p` ; do kill -9 $x ; done
Kalau-kalau ini membantu orang lain - kebanyakan orang di sini karena mereka memiliki beberapa proses berhenti yang mereka mulai, mungkin latar belakang melalui shell. Saya perlu menemukan proses, sebagai root, dihentikan oleh pengguna lain, untuk mana varian pada jobs
perintah tidak akan melakukannya.
Sedikit menggali dengan man ps
membuat saya melakukan ini:
ps -a -o pid,user,cmd,state | grep 'T$'
Penjelasan: -a
bendera mengatakan tunjukkan semua proses, kemudian -o
kontrol output, info apa yang akan ditampilkan tentang setiap proses. Saya memilih pid
, user
, cmd
(baris perintah), dan state
, yang merupakan negara 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 menyalurkannya ke grep T$
yang mengatakan, tunjukkan semua proses yang memiliki T di kolom terakhir.
Dan kemudian saya memiliki daftar yang bagus dari semua proses dari pengguna yang berbeda yang 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
jobs -ps
lebih sederhana dari jawaban ini. Karena itu, jawaban ini tidak hanya menampilkan pekerjaan yang dihentikan melalui Ctrl-Z
shell, tetapi semua menghentikan pekerjaan: shell lain , pengguna lain , termasuk pekerjaan yang sedang di-debug (mis. Oleh gdb).
ps -el | grep T
untuk menemukan proses dalam keadaan 'T'.
Jika Anda ingin menghapus beberapa pekerjaan yang terhenti 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, ia tidak akan melakukan apa-apa selain mengantri daripada membawanya di latar depan, itu akan berakhir
$ fg %2
./parse < call.txt
Terminated
$ jobs -l
[3]- 4819 Stopped ./parse < call.txt
Biasanya jika Anda mendapat pesan itu, Anda harus keluar dua kali. Misalnya pertama Ctrl+Dmemberi Anda pesan peringatan untuk memberi tahu Anda tentang pekerjaan yang berhenti, menekan untuk kedua kalinya akan mengeluarkan Anda dari membunuh pekerjaan. Ini berlaku untuk logout
dan exit
perintah yang sama.
Untuk membunuh mereka secara manual, coba: kill $(jobs -p)
.
Jika Anda tidak ingin mematikan 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 (seperti SIGTTIN
, atau SIGTTOU
).
Jika jobs
perintah shell builtin tidak tersedia, proses yang dihentikan dapat didaftar 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