Linux sunucumdan çıkmaya çalıştığımda şu mesajı alıyorum:
Durdurulan işler var.
: Bunları öldürmek için tek bir komut var mı?
shopt -s checkjobs
Benim .bashrc koymak zorunda kaldım
Linux sunucumdan çıkmaya çalıştığımda şu mesajı alıyorum:
Durdurulan işler var.
: Bunları öldürmek için tek bir komut var mı?
shopt -s checkjobs
Benim .bashrc koymak zorunda kaldım
Yanıtlar:
Bash altındaki tüm durdurulan işleri hızlı bir şekilde öldürmek için, şunu girin:
kill -9 `jobs -ps`
jobs -ps
-p
durdurulan ( -s
) işlerin işlem kimliklerini ( ) listeler .
kill -9 `jobs -ps`
hepsine SIGKILL sinyalleri gönderir.
sudo kill `jobs -p`
işe yaramadı ama açıkça PID yazarak yaptı.
kill
böyle bir işlem hiçbir şey yapmaz, işlemler durduğundan, kendilerine varsayılan olarak gönderilen SIGTERM'i (-15) işlemez.
Bunu yazmayı deneyin:
kill -9 $(jobs -p)
Kabul edilen cevap tüm işleri öldürür (bu durumda yeterlidir) ve sadece durdurulanları değil. Sadece Durdurulanları öldürmek istiyorsan, koş:
kill $(jobs -l | grep Stopped | cut -d' ' -f3)
awk '/Stopped/{print $3}')
-s
Kabul cevap filtreleri durdu olanlar üzerinde argüman
En kolay yol aslında çıkışı hemen yeniden denemektir; bash
Bunu "durdurulan işleri öldür ve çık" anlamına gelecektir.
for x in `jobs -p` ; do kill -9 $x ; done
Bunun başka birine yardım etmesi durumunda - çoğu insan buradadır, çünkü başlattıkları bazı durdurma süreçleri vardır, belki kabuktan geçmişlerdir. Komuttaki değişkenlerin jobs
yapamayacağı , diğer kullanıcılar tarafından durdurulmuş kök olarak işlemler bulmam gerekiyordu.
Etrafta bir miktar kazma man ps
beni bu noktaya getirdi :
ps -a -o pid,user,cmd,state | grep 'T$'
Açıklama: -a
bayrak tüm işlemleri gösterdiğini, ardından -o
çıktıları kontrol ettiğini, her işlem hakkında hangi bilgilerin gösterileceğini söylüyor. Ben seçiyorum pid
, user
, cmd
(komut satırı) ve state
hangi süreç devlet .
Kimden 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
bu yüzden nihayet onu boruya yazdım grep T$
, son sütunda T olan tüm işlemleri göster.
Ve sonra durdurulan durumda olan farklı kullanıcılardan gelen tüm işlemlerin güzel bir listesi var.
$ 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
bu yanıttan daha basittir. Olduğu söyleniyor, bu cevap sadece Ctrl-Z
bir kabuğun içinde durdurulan işleri değil, tüm durdurulan işleri gösterir: diğer kabuklar, hata ayıklanan işler dahil diğer kullanıcılar (örneğin, gdb).
ps -el | grep T
'T' durumundaki süreçleri bulmak için kullanmak zorunda kaldım .
Durdurulan işleri kaldırmak ancak hepsini kaldırmak istiyorsanız, şunu deneyin:
İlk önce işleri listele, şöyle bir şey alacaksın:
$ jobs -l
[2] 4813 Stopped ./parse < call.txt
[3]- 4819 Stopped ./parse < call.txt
durdurulan bir işe öldür göndermek, ön plana getirmek yerine kuyruktan başka bir şey yapmaz, sonlandırır
$ fg %2
./parse < call.txt
Terminated
$ jobs -l
[3]- 4819 Stopped ./parse < call.txt
Normalde bu mesajı aldıysanız, iki kez oturumu kapatmanız gerekir. Örneğin Ctrl+D, size durdurulan işler hakkında sizi uyaracak uyarı mesajını verir, ikinci kez basmak işleri öldürmenizi engeller. Bu aynı şey logout
ve exit
komutlar için de geçerlidir .
El ile onları öldürmek için deneyin: kill $(jobs -p)
.
İşleri şu anki kabuğunuzdan çıkarmak istemiyorsanız, disown
komutları kullanarak öldürmeden aktif işleri tablosundan kaldırabilirsiniz . Örneğin
$ sleep 1000 &
[1] 19404
$ jobs
[1]+ Running sleep 1000 &
$ disown
Ayrıca yöntem (devlet tarafından belirlenebilir durduruldu iş T
işlem anlamına gelir karakteri) gibi sinyal ile durduruldu SIGSTOP
, SIGTSTP
ve diğer (gibi SIGTTIN
, ya da SIGTTOU
).
Durumda jobs
bir kabuk yerleşik komutu kullanılamaz, süreçler aşağıdaki komutu tarafından listelenen edilebilir durdu:
ps wuax | awk '$8 ~ "T"'
Hepsini öldürmek için temel olarak şunları yazabilirsiniz:
kill -9 $(ps wuax | awk 'NR>1 && $8 ~ "T" {print $2}')
İşte basit bir test:
$ 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