Kabuk betiği arka plan komutu için bekle


12

Bir senaryo yazıyorum, ama bunu yapmanın bir yolunu bulamadığım bir şey var ...

Ben arka planda "command1 &" bir komut yapmak gerekir ve sonra komut bir yerde ben command2 yapmadan önce bitirmek için beklemek gerekir. Temel olarak, buna ihtiyacım var:

NOT: her komut belirli bir dizinde çalışır! while döngüsünün sonunda benim command1 4 dizilim oluşturdu, burada her biri belirli bir işlemi çalıştırır, böylece toplam çalışan çalışma 4'tür.

a=1

while [$a -lt 4 ]

     . command1
   #Generates 1 Process  

     a= `export $a +1`
done

   #Wait until the 4 process end and then run the command2 

    . command2

Ben waitpid işlem numarası ile bir komut hakkında bir şey gördüm , ama bu da işe yaramadı.


Kontrol ediyor command1musun? Bunu 4 işlemin PID'lerini döndürecek şekilde değiştirebilir misiniz?
terdon

Evet! i have that already :)
Joao Makao

Cevabımı buna göre güncelledim. Bana, senin beklentilerinize uyup uymadığını söyle.
Laurent

Bu Q bununla ilgilidir: unix.stackexchange.com/questions/100801/… . Tek fark, PID'yi arka plandaki bir işlemden almanız gerektiğidir. $!Değişkeni, bunu göstermek için waitkomutta geçirerek bunu elde etmek için kullanabilirsiniz . $!en son arka planlı PID'yi içerirken $$son işlem çalıştırmasının PID'sini içerir.
slm

3
Tamam, şimdi betiğiniz hiç mantıklı değil. Her yerde sözdizimi hataları ve gariplik var. Bize gerçek senaryoyu gösterebilir misiniz ? Neden komutlar veriyorsunuz? Neden sadece idam etmiyoruz?
terdon

Yanıtlar:


22

wait PIDBir işlemin bitmesini beklemek için komutu kullanabilirsiniz .

Ayrıca, son komutun PID'sini $!

Sizin durumunuzda, böyle bir şey işe yarayacaktır:

command1 & #run command1 in background
PID=$! #catch the last PID, here from command1
command2 #run command2 while command1 is running in background
wait $PID #wait for command1, in background, to end
command3 #execute once command1 ended

Düzenlemenizi takiben, birden fazla PID'niz olduğu ve bunları bildiğiniz için bunu yapabilirsiniz:

command1 & #run command1 in background
PID1=xxxxx
PID2=yyyyy
PID3=xxyyy
PID4=yyxxx
command2 #run command2 while command1 is running in background
wait $PID1 $PID2 $PID3 $PID4 #wait for the four processes of command1, in background, to end
command3 #execute once command1 ended

Düzenlemenizi takiben, oluşturulan PID'yi (xxxxx, yyyyy, xxyyy, yyxxx) biliyorsanız, beklemek için PID'lerin listesiyle birlikte beklemeyi de kullanabilirsiniz (adama bakın). Onları tanımıyorsanız, belki onları command1'e (command1 nedir? Kendi komut dosyanız nedir) toplayabilirsiniz
Laurent C.

Her şeyden önce doğru gruplandıklarından emin olmak en iyisidir. Bunun nasıl yapılabileceği hakkında bir fikrim için cevabımı görün.
mikeserv

4

Bunu yapmanın en temiz yolu comamnd1, başlatılan süreçlerin PID'lerini geri döndürmek ve waither birini @ LaurentC'nin cevabı tarafından önerildiği gibi kullanmaktır .

Başka bir yaklaşım şöyle olabilir:

## Create a log file
logfile=$(mktemp)

## Run your command and have it print into the log file
## when it's finsihed.
command1 && echo 1 > $logfile &

## Wait for it. The [ ! -s $logfile ] is true while the file is 
## empty. The -s means "check that the file is NOT empty" so ! -s
## means the opposite, check that the file IS empty. So, since
## the command above will print into the file as soon as it's finished
## this loop will run as long as  the previous command si runnning.
while [ ! -s $logfile ]; do sleep 1; done

## continue
command2

üzgünüm ama hala çalışmıyor .. Sorumu bir kez daha geliştireceğim!
Joao Macau

0

Aşağıdaki yöntemi kullanırsanız, while döngüsünden sonra özel bir "tüm işlemleri bekle" seçeneğine ihtiyacınız olmayabilir. Döngü, command1yukarı geri dönmeden önce akımın tamamlanmasını bekleyecektir . Lütfen herhangi bir tavsiye için dikkatli olun. Dikkat edin, yaptığım tek şey & wait $!, sonuna eklemekti command1.

a=1
while [$a -lt 4 ]
     . command1  & wait $!
   #Generates 1 Process  
     a= `export $a +1`
done
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.