Arka planda çalışan bir bash kabuk betiğini sonlandırma


16

bashBirçok farklı dosya için basit komutları çalıştırmak için genellikle kabuk betikleri kullanırım. Örneğin, ben şu olduğunu varsayalım bashdenilen shell script, script.shprogramın / komutu çalıştırır, fooüç metin dosyaları "a.txt", "b.txt", "c.txt":

#!/bin/bash

for strname in "a" "b" "c"
do
foo $strname".txt"
done

Ayrıca, bunun foo $strname".txt"yavaş olduğunu varsayalım , betiğin çalıştırılması uzun zaman alacaktır (örneğin saat veya gün). Bu nohupnedenle, terminal kapalı veya bağlantısı kesilmiş olsa bile yürütmenin devam etmesi için kullanmak istiyorum . Ayrıca komut dosyasının hemen arka plana gitmesini istiyorum, bu yüzden &operatörü kullanacağım . Böylece aramak için aşağıdaki komutu kullanacağım script.sh:

nohup bash script.sh &

Bu, betiği arka planda ve kapatmadan çalıştırmak için iyi çalışır, ancak şimdi bir nedenden dolayı bir noktada yürütmeyi sonlandırmak istediğimi varsayalım. Bunu nasıl yapabilirim?

Karşılaştığım sorun, bakarak topsadece fookarşılık gelen görüyorum "a.txt". Bu fooçağrıyı sonlandırabilirim , ama sonra fookarşılık gelen "b.txt"çağrılır ve sonra da bu çağrıyı sonlandırmak zorundayım vb. Döngüde belirtilen onlarca veya yüzlerce metin dosyası için for, her foobirini tek tek sonlandırmak acı verici olur ! Yani her nasılsa bunun yerine kabuk komut dosyasından verilen özel çağrıları değil, kabuk komut dosyasının kendisini sonlandırmam gerekiyor .

Komutu yazdığımda

ps -u myusername

myusernamekullanıcı adım nerede , çalıştırdığım işlemlerin bir listesini alıyorum. Ancak iki farklı işlem kimliği görüyorum bash. Varsa, bu işlemlerden hangisinin orijinal çağrıma karşılık geldiğini nasıl bilebilirim nohup bash script.sh &?


@Andrew, Her iki işlem de komutta belirtilen nohup'u gösteriyor mu? .... alternatif olarak ps -aWu Andrew deneyebilir ve nohup ile tek bir uzun giriş bulmak olup olmadığını kontrol edebilirsiniz .... yardımcı olur mu?
nitin

2
Bir yana, alıntılarınız tuhaf. for s in a b c; do foo "$s".txt; done
tripleee

1
@NSD: Hayır, nohupbaşladığınız işi görmek için bir süreç listesi açtığınız zaman çoktan kaybolacaktır. psÇıktıdaki "incelik" sütununa bakabilirsiniz, ancak buradaki yanıtlar daha yararlıdır.
Üçlü

Yanıtlar:


10

Varsayılan olarak, psprogramın çağrıldığı parametreleri göstermez. Seçenekler -fve -lher ikisi de tam aramayı gösterir.

ps -fu username

şuna benzer bir çıktıyla sonuçlanır:

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh

2
Bu orta derecede yararlıdır, ancak aynı argümanlarla birden fazla süreci belirsizleştirmez.
Üçlü

11

Birkaç seçeneğin var. İşleminiz arka planda çalıştığından jobsbulmak için kullanabilirsiniz :

nohup bash script.sh &
...
jobs
[1]+ Running    nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &

pkillİşlem tablosunda bir komut satırı eşleşmesi aramak için de kullanabilirsiniz ; yani:

pkill -f script.sh

1

ps(Örneğin, çıkış ps aux) ebeveynin işlem kimliğini içerir. Ebeveynleri öldürün bashve çocukları da feshedilecek.

İşlem ağacının ASCII görselleştirmesi için, pstree -pbirkaç arka plan işlemi çalışırken deneyin .

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.