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 &?
for s in a b c; do foo "$s".txt; done
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.