bash

2012-03-02 24 views
5

içinde tuzak kullanarak sonlandırılmış arka plan sürecinin pid yakalama Bir dizi arka plan işlemlerini üreten bir bash komut dosyası yazıyorum. Bir süreç sona erdiğinde bildirilmek isterim; ve sonlandırılmış sürecin pidini bilmek istiyorum.bash

wait kullanarak, her bir oluşturulmuş işlemin pids'lerinin bir dizide yakalanıp saklanacağı ve sonra dizinin üzerinde yineleneceği ve her işlem için beklemenin yapıldığı görülmüştür. Bu teknik burada çeşitli şekillerde tarif edilir: Ben doğru anlamak eğer

https://stackoverflow.com/a/356154/366856

bu sorun, bireysel bir süreç sona erdiği konmaz eylemi gerçekleştirmek istiyorsanız nispeten verimsiz olabilmesidir . Örneğin, A ve B işlemlerini ve B'yi A'dan önce bitirirseniz, yürütme işlemi hem A hem de B'nin bitmesini beklemelidir. B biter bitmez bir işlem yapmam gerek.

trap SIGCHLD, bir çocuk sonlandığında hemen bir eylem gerçekleştirme yoludur, ancak sorun şu ki, aynı zamanda ihtiyaç duyduğum SIGCHLD sinyalinin kaynağını belirlemek için bir yol bulamıyorum. Bunun bir uygulama örneğinin saptadığımız en yakın şey bu yazı üçüncü kod örnektir:

Ben kolaylık buradan kopyalanıp yapıştırılan ettik

http://www.linuxforums.org/forum/programming-scripting/103996-multithreading-bash.html#post510187

:

#!/bin/bash 

iNext=0 

function ChildReturned() { 
     wait $1 
     echo "$1 was returned. Its exits status was: $?" 
     iNext=$((iNext+1)) 
     StartChild $iNext 
} 


function StartChild { 
     ./child $1 & 
     pid=$! 
     echo "Started: $1 PID= $pid" 
     trap 'ChildReturned $pid' SIGCHLD 
} 


set -bm 

for ((iNext=0; iNext<=10; iNext++)); 
do 
     StartChild $iNext 
done 

wait 

ben Bu örneğin işe yaramadığını düşünün çünkü yazar, trap numaralı çağrıyı birden çok kez çağırıyordu, her defasında farklı bir pid değişkeni trap argümanında yakaladı. Her zaman tuzak denir, önceki çağrının üzerine yazar ve böylece keyfi bir pid yakalanır. Daha iyi bir teknik bulamadım.

Bash'da tuzak kullanarak sonlandırılmış alt işlemin pidini elde etmenin bir yolu var mı?

Sadece şimdiye kadar gördüğüm bu soruna çözüm en iyi, en kapsamlı bir bakış içeren bu kaynak, işaret etmek istedik

Güncelleme:

http://mywiki.wooledge.org/ProcessManagement#I_want_to_process_a_bunch_of_files_in_parallel.2C_and_when_one_finishes.2C_I_want_to_start_the_next._And_I_want_to_make_sure_there_are_exactly_5_jobs_running_at_a_time.

+2

http://mywiki.wooledge.org/ProcessManagement – jordanm

+0

'kill -0 $ PID': Çok kullanışlı! Teşekkürler! – jbeard4

+0

Daha da iyisi, bölüm denilen * Bir grup dosyayı paralel olarak işlemek istiyorum ve bittiğinde bir sonraki aşamaya geçmek istiyorum. Ve bir seferde tam olarak 5 işin çalıştığından emin olmak istiyorum. * Şu ana kadar okumuş olduğum en iyi cevap – jbeard4

cevap

3

Kapanı bir kez ayarlayın ve son kontrol edildikten sonra hangi çocukların bittiğini görmek için tuzakta jobs -n numaralı telefonu arayabilirsiniz. Bu, hangi çocuğun SIGCHLD'yi gönderdiğini söylemediğini unutmayın; Tuzağa girmeden önce iki çocuğun öldüğü davayı düşünün. Bu durumda, sadece bir kere tuzağı gireceksiniz ve bu, çocuğa gerçekten yanıt verdiğiniz sinyalin bir noktasıdır. Not -n bir bash uzantısıdır ve jobs -l kullanmayı tercih edebilirsiniz.

+0

Cool, 'jobs -n' hakkında bir şey bilmiyordum.Bence bu benim problemimi çok iyi çözmeli ve ben de bu soruyu çözülmüş olarak işaretleyeceğim. – jbeard4