Tüm arka plan işlerini öldür


63

Arka plan işlerini öldürmekten daha kompakt bir biçim var mı:

for i in {1..5}; do kill %$i; done

Ayrıca, {1..5} açıkça kodlanmış bir sihir numarasına sahip, N'yi bir numara yapmadan doğru numaraya sahipken "N" nasıl yapabilirim:

$(jobs | wc -l)

Aslında PS1'de \ j tarafından yönetilen işlerin sayısını almak için kullanıyorum, bu eşdeğer mi?


3
kill $(jobs -p)daha kolay görünüyor.
jw013

Mümkünse işleri ayrı ayrı öldürmeyi tercih ederim. (
Yorumunuzu

for pid in $(jobs -p); do kill $pid; done?
jw013

3
@ jw013 Sadece kolay değil, aynı zamanda doğru (lütfen bir cevap olarak gönderin), jobssadece işlerin arka arkaya numaralandırılması durumunda işe yarayan çıktı satırlarını saymaya dayalı bir çözümden farklı olarak. Oh, ve “işleri tek tek öldürmek” anlamsız: birden fazla PID'yi killkomuta geçirmek, onları ayrı ayrı geçirmekle aynı şeyi yapıyor.
Gilles

Komuta yanlış girdim, $ (jobs -p) kelimesini öldürdüm ve benim için de çok doğru görünüyor. Kabul etmeye hazır.
Robottinosino,

Yanıtlar:


102

Yalnızca killyönetilen tüm arka plan işlerini bashyapmak için

kill $(jobs -p)

Her iki yana unutmayın jobsve killyerleşik olan bash, sen herhangi hataları girmek olmamalıdır Argüman listesinin çok uzun türü.


2
Aynı zamanda gelecek nesiller için, Bahamat'ın düşündüğü şey, bunu yapmanın yolu hakkında zshherhangi bir otorite olarak diskalifiye etmektir.
peth

Bunu bilmem gerekiyor gibi hissediyorum, fakat '$' burada nasıl çalışıyor?
fersarr,

1
@fersarr İşte gidiyorsunuz
jw013

@bahamat Bu aslında işe yaramaz çünkü PID, işin% + veya% olması ya da olmamasına bağlı olarak 2 ya da 3 alanında olabilir. İşe yarıyor kill %${(k)^jobdirs}, hangisi daha uzun; PID'leri listelemeniz gerekiyorsa, daha uzun süre kullanabilirsiniz ${${jobstates#*:*:}%%=*}.
Gilles


15

Alt komut xargsyerine kullanın $(jobs -p), çünkü eğer jobs -pboşsa kill komutu başarısız olur.

jobs -p | xargs kill

1
Bu aynı etkiye sahiptir, ancak yardımı basar ve kod 123 ile çıkar
cat

1
Komut OSX'te iyi çalışıyor ancak Debian'da çalışmıyor
brunocascio

Bu CentOS 6 güzel çalışıyor
Janac Meena

jobs -p | xargs -rn10 killjobs -pPID'lerin iadesi olmazsa daha iyi olur . Bu -rseçeneğin GNU uzantısı olduğunu not edin .
NarūnasK

Yukarıda belirtildiği gibi, -rkısa biçimidir --no-run-if-emptyiçin GNU uzantısı xargsyapması belirtilmiş olup stdin'nin hiçbir veri varsa komutunu çalıştırın.
Anthony G - Monica

3

Onları öldürmeden önce var olan herhangi bir iş olup olmadığını kontrol etmeyi tercih ederim - bu şekilde çalışan hiçbir şey yoksa komut dosyası başarısız olmaz.

Yazması da daha kısa. Bunu içine at .bash_profile:

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

O zaman koş:

killjobs

Çalışan işleri öldürmek için.


1

MacOS'ta her bir işleme SIGINT göndererek, incelikle sonlandırmak istediğim birkaç arka plan bileşik komutum var. Diğer çözümlerin hiçbiri bunun için düzgün çalışmadı, bu yüzden şunu buldum:

jobs -p | xargs -n1 pkill -SIGINT -g

jobs -p Geçerli kabuk tarafından başlatılan arka plan işlemlerini listeler.

xargs -n1 Her iş için bir kez pkill yürütür.

pkill -SIGINT -g SIGINT'i (ctrl + c ile aynı) işlem grubundaki tüm işlemlere gönderir.


1

Sanırım çıktının jobs -pverdiğine bağlı olarak , çözüm biraz farklı olabilir. Benim durumumda

$ jobs -p
[1]  - 96029 running    some job
[2]  + 96111 running    some other job

Bu nedenle, aşağıdakileri yapmak iyi değildir.

$ jobs -p | xargs kill
kill: illegal process id: [1]

Öte yandan, çalışan kill $(jobs -p)PID olmayan dizgelerin killde iletildiği için birçok hata mesajı gerektirir .

Bu nedenle, benim çözümüm grepönce PID'e sonra xargsda aşağıdaki gibi kullanmaktır :

$ jobs -p | grep -o -E '\s\d+\s' | xargs kill

1
Hangi kabuğu kullanıyorsunuz? Ne echo $0gösterir? Ne help jobsgösterir? Gösterilen çıktı POSIX uyumlu değil ; herhangi bir uygulamasında amaçlanan davranışla jobsbir -pseçenek olmalıdır .
Wildcard

1
Bunu gösterdiğin için teşekkürler. Ben zsh kullanıyorum ve garip çıktı için nedeni budur. Bash'a geçtim ve jobs -pyalnızca PID çıktı. Zsh’ın POSIX’le uyumlu olmadığını öğrendim.
Fanchen Bao

0

Öyle görünüyor jobs -p | xargs killki, işi yapıyor, ancak öldürmek için bazı borularda istenmeyen çıkışlar oluşturuyor. Burada jobs -p, + veya - karakterine sahip / sahip olmama çıkışını gruplandırıyorum.

function killjobs() {
    JOBS=$(jobs -p)
    echo $JOBS | grep -v "+\|-"| awk '{print $2}' | xargs kill -9
    echo $JOBS | grep "+\|-"| awk '{print $3}' | xargs kill -9
}

Ve sonra arayabilirsin killjobs

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.