bash
Birç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 bash
denilen shell script, script.sh
programı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 nohup
nedenle, 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 top
sadece foo
karşılık gelen görüyorum "a.txt"
. Bu foo
çağrıyı sonlandırabilirim , ama sonra foo
karşı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 foo
birini 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
myusername
kullanı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 &
?
for s in a b c; do foo "$s".txt; done
nohup
baş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.