2010-02-18 11 views
7

Bekleyin tüm çocuk süreçlerinin durması beklemez.Linux "Wait" komutunun yapılması TÜM alt süreçlerin beklenmesi

#!/bin/bash 

titlename=`echo "[email protected]"|sed 's/\..\{3\}$//'` 
screen -X title "$titlename" 

/usr/lib/process.bash -verbose [email protected] 

wait 

bash -c "mail.bash [email protected]" 
screen -X title "$titlename.Done" 

Ben /usr/lib/process.bash erişimi yok, ama sık sık değişen bir komut dosyası, bu yüzden ona başvuru istiyorum ... ama: Bu benim senaryom bu komut:

#!/bin/ksh 
#lots of random stuff 
/usr/lib/runall $path $auto $params > /dev/null 2>&1& 

Sorunum runall bir günlük dosyası oluşturur ... ve mail.bash bana o günlük dosyası posta varsayalım, ancak bekleme runall bekliyor olmamasıdır Bitirmek için, sadece görünüyor Bitirmek için process.bash için bekliyorum. process.bash işlem görmeden veya process.bash process.bash'ın güncel sürümüne sahip olmaya devam etmek için runall runall beklemek için beklemek için zaten var mı?

Teşekkür, sadece doğrudan çocuklar için bekler

+0

Eğer ps -ef 'ilgili bölümlerine bize miyim 'bekle 'bittikten sonra? Bu hangi süreçlerin çalıştığını ve hangi sürecin başka bir sürecin çocuğu olduğunu göstermelidir ... – Heinzi

+0

Komut dizim ve Process.bash neredeyse anında sona eriyor. Kalan tek süreç rasgele PID'lerin altında çalışan runall. – Dan

cevap

9
(
    . /usr/lib/process.bash -verbose [email protected] 
    wait 
) 

yerine OS process.bash başlatmak izin vererek, bu, bir altkabuk yaratır gibi process.bash tüm komutları çalıştırır eğer kabuk betiğimize girmişlerse ve bu alt kabukta beklerlerse.

Bunun için bazı uyarılar vardır, ancak alışılmadık bir şey yapmıyorsanız çalışmalıdır.

+0

Vay canına ...öyleyse koşmak benim senaryodaki bir çocuk süreci Bu bir cazibe gibi çalıştı (ben script'i process.bash ile eşleştirmek için ksh olarak değiştirdim). Ctrl + C, sadece runall yerine beklemeyi durdurur ... İdeal olarak sadece "&" olmadan process.bash'i çalıştırabilirim, ancak bu kodu değiştiremiyorum ve güncellemeyi sürdürmek istemiyorum kodum her zaman process.bash değişiyor. Teşekkürler. – Dan

+3

Ctrl-C arka plan işlemini öldürmek için tuzak kullanın ve öldürün: 'pid = $ !; trap "$ pid'i öldür; $ pid bekleyin; 0'dan çık" SIGINT SIGTERM; bekle $ pid' –

4

wait Dan (günlük dosyası önceki koşmak üzerine yazar, böylece her zaman bir tane beri ben sadece, günlük dosyasının varlığını kontrol edemez); Herhangi bir çocuk kendi çocuklarını doğurursa, onları beklemez.

+0

Bunun etrafında zaten var mı? Bütün çocukları, doğrudan ve dolaylı olarak beklemesini istiyorsam? – Dan

+1

Diğer tek yol PID veya jobspec tarafından beklemek. –

2

Asıl sorun, process.bash'dan çıktığı içinişleminden çıkması ve init (PID 1) tarafından sahiplenilmesidir. runall işlem listesine bakarsanız, ara process.bash komut dosyasının çıkmasından bu yana işleminizle herhangi bir görünür bağlantı olmayacaktır. ps --ppid'u kullanmanın veya yetim kalan bir kez bu "torun" sürecini aramak için benzer bir yol yoktur.

Belirli bir PID'de wait yapabilirsiniz. runall işleminin PID'sini biliyor musunuz? sadece tek bir süreç varsa tüm çalışan runall s bekleyecek olan bu, deneyebilirsiniz:

wait `pidof runall` 
+0

Çalışma, orijinal komut dosyasının bir alt öğesi olmadığından çalışmaz. – abhaga

1

Sen bekle

bekleyin Sonra komuta bağımsız değişken olarak bu PID geçirmek isteyen kimin için sürecin PID iyileşmek olabilir