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 checkjobsBenim .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 checkjobsBenim .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-pdurdurulan ( -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ı.
killbö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}')
-sKabul cevap filtreleri durdu olanlar üzerinde argüman
En kolay yol aslında çıkışı hemen yeniden denemektir; bashBunu "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 jobsyapamayacağı , diğer kullanıcılar tarafından durdurulmuş kök olarak işlemler bulmam gerekiyordu.
Etrafta bir miktar kazma man psbeni bu noktaya getirdi :
ps -a -o pid,user,cmd,state | grep 'T$'
Açıklama: -abayrak 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 statehangi 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 -psbu yanıttan daha basittir. Olduğu söyleniyor, bu cevap sadece Ctrl-Zbir 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 logoutve exitkomutlar için de geçerlidir .
El ile onları öldürmek için deneyin: kill $(jobs -p).
İşleri şu anki kabuğunuzdan çıkarmak istemiyorsanız, disownkomutları 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ş Tişlem anlamına gelir karakteri) gibi sinyal ile durduruldu SIGSTOP, SIGTSTPve diğer (gibi SIGTTIN, ya da SIGTTOU).
Durumda jobsbir 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