linux: arka plan görevini sonlandır


197

Linux'ta ortaya çıkan son arka plan görevini nasıl sonlandırırım?

Misal:

doSomething
doAnotherThing
doB &
doC
doD
#kill doB
????

18
Bu nasıl programlama ile ilgili olmayabilir? Bash programlama programlama değil mi?
flybywire

6
Bu, SO ve SU arasındaki örtüşme bölgesinde, ancak burada SO'ya daha iyi uyduğunu düşünüyorum. Bu şekilde düşünmek için kriterlerim, @flybywire bunu bir senaryoda yapıyorsa, programlamadır. Bunu komut satırından yapmak isteseydi, SU'ya ait olduğunu söyleyebilirim.
Bill the Lizard

10
Kabuk komut dosyası da programlamadır.
cletus

Yanıtlar:


238

Bash'de bunun için özel bir değişken var:

kill $!

$! arka planda yürütülen son işlemin PID'sine genişler.


68
@ polm23; hayır, ^Zişleri arka planda tutmaz, onları durdurur. Bir sonraki bggerçek 'arka planı' yapar (arka planda yürütmeyi sürdürür) ve bundan sonra $!beklendiği gibi çalışır.
falstro

Öldürmeden sonra ????bir veya daha fazla komutun yerine getirileceğini varsayarak, bu komutlardan herhangi biri arka plan işlemi tarafından yapılan işe dayanıyorsa, arka plan işleminin daha sonra bir sinyal işleyicide gerçekleştirebileceği temizleme veya bitirme görevlerine dikkat edin. bir (yakalanabilir) sinyal alma. Bu tür 'bağımlı' komutların ilkinden hemen önce a wait(ardından belki a syncveya hatta a sleep <n>) eklemek en iyisidir.
ack

2
Tamamlama için: Tek bir% aynı zamanda mevcut işi ifade ettiğinden, durdurulan işi (^ z) "kill%" ile sonlandırabilirsiniz. Bunu neredeyse her zaman ^ z'den sonra kullanırım.
t3o

Bu, yalnızca etkileşimli kabuklarda varsayılan olarak açık olan iş denetimini etkinleştirdiyseniz işe yarar (yine de ctrl-z kullanmaya atıfta bulunduğunuz için aynı zamanda etkileşimli bir kabuk kullanmaya da değiniyorsunuzdur) - ancak bu buradaki diğer yanıtlarda ana hatları
çizildi

289

İş numarasına göre öldürebilirsin. Arka plana bir görev koyduğunuzda şöyle bir şey göreceksiniz:

$ ./script &
[1] 35341

Bu [1]iş numarasıdır ve şu şekilde referans gösterilebilir:

$ kill %1
$ kill %%  # Most recent background job

İş numaralarının bir listesini görmek için jobskomutu kullanın. Daha fazlası man bash:

Kabuktaki bir işe gönderme yapmanın birkaç yolu vardır. Karakter %bir iş adı sunar. İş numarası nolarak anılabilir %n. Bir işe, onu başlatmak için kullanılan adın bir öneki veya komut satırında görünen bir alt dize kullanılarak da başvurulabilir. Örneğin, %cedurdurulmuş bir ceişi ifade eder . Bir önek birden fazla işle eşleşirse, bash bir hata bildirir. Kullanmak ise komut satırında %?cedizeyi içeren herhangi bir işi ifade eder ce. Alt dize birden fazla işle eşleşirse, bash bir hata bildirir. Semboller %%ve%+Ön plandayken veya arka planda başlatılırken durdurulan son iş olan mevcut işin kabuğunun kavramına bakın. Önceki iş kullanılarak referans verilebilir %-. İşlerle ilgili çıktıda (örneğin, işler komutunun çıktısı), geçerli iş her zaman a +ile ve önceki iş a ile işaretlenir -. Tek bir %(beraberinde iş belirtimi olmaksızın) mevcut işe de atıfta bulunur.


Kayıt için, bunun yalnızca iş kontrolü etkinleştirildiğinde işe yaradığını düşünüyorum. Komut dosyalarında ( set -m) açabileceğinizi düşünmeme rağmen , etkileşimli kullanım için tasarlanmıştır. Stackoverflow.com/questions/690266/…
adresini

9
Çok kullanışlı semboller, bunlar %1ve %%- özellikle. Ctrl-C'de bazı şeyler ölmez, bu yüzden onları Ctrl-Z'ye ve sonra kill -9 %%. Yararlı bulduğum bir örnek: while true; do mplayer <some unstable online radio>; date >> restarts.log; done- Ctrl-C sizi bir sonraki döngü yinelemesine götürecektir. Yapmam psveya belki yapmadan önce jobs -lve sonra sıkıcı olan PID'yi yeniden yazdım .
Tomasz Gandor

Tüm işler için bir tane var mı?
CMCDragonkai

3
Eğer değiştirmek isteyebilirsiniz neden @TomaszGandor budur while trueile while sleep 1. Bununla yaşayabilirseniz, yeniden başlamadan önce bu size kısa bir gecikme verecektir ve eğer ctrl-c'ye iki kez basarsanız, ikincisi uykuyu kesecek, sıfır olmayan bir çıkışla sonlandıracak ve döngüden kopacaktır.
falstro

45

Aşağıdaki komut, pid ile birlikte oturumunuzdaki tüm arka plan işlemlerinin bir listesini verir. Daha sonra işlemi bitirmek için kullanabilirsiniz.

jobs -l

Örnek kullanım:

$ sleep 300 &
$ jobs -l
[1]+ 31139 Running                 sleep 300 &
$ kill 31139

26

Bu, tüm arka plan işlemlerini öldürmelidir:

jobs -p | xargs kill -9

1
Bu daha önce kullandığım şeydi ama kill -9 %%daha az
yazıyor

4
@TomaszGandor Yalnızca mevcut işi, yani ön planda durdurulan veya arka planda başlatılan son işi öldürür. Cevaptaki komut TÜM işleri öldürecektir.
Alex Bitek


2
skill doB

skill kill komutunun, belirli bir kritere göre bir veya daha fazla işlem seçmenize izin veren bir sürümüdür.


0

Onun pid'ine ihtiyacınız var ... onu bulmak için "ps -A" kullanın.


0

bu konu dışı bir cevaptır, ancak ilgilenenler için değerli olabilir.

@John Kugelman'ın cevabında olduğu gibi,% işin spesifikasyonuyla ilgilidir. bunu verimli bir şekilde nasıl bulabilirim? daha az & desen komutunu kullan , görünüşe göre adam daha az çağrı cihazı kullanıyor (o kadar emin değil), man bash türünde &% sonra Enter sadece '%' içeren satırları gösterecek, tümünü yeniden göstermek için & yazın. sonra Girin.


-3

Killall komutunu kullanın:

Killall taskname

daha fazla bilgi ve daha gelişmiş seçenekler için "man killall" yazın.


4
Bence, PID'ye gerçekten kolay erişiminiz olduğunda, killall'ın biraz agresif olduğunu düşünüyorum. Ve tehlikeli de, özellikle de root iseniz
Dave Vogt

3
Gerekirse killall pythonya killall javada sistemin başka bir yerinde çalışan yararlı bir şey varken pek yardımcı olmaz .
Tomasz Gandor
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.