2017-02-22 36 views
5

Komut dizimde, bir hata meydana geldiğinde işlemeyi durdurmak için set -e'u ayarlıyorum. Ön planda çalışan tüm komutlar için iyi çalışır, ancak bazı komutlarım arka planda paralel olarak çalıştırılmalıdır. Maalesef arka plan işlemi başarısız olursa, betik set -e bayrağı olmasa da durdurulmaz.set -e ve arkaplan işlemi

Ön plan işlemleriyle örnek çalışma.

#!/bin/bash 
set -e 
ls -l no_file 
sleep 100 

Arka plan işlemi ile örnek çalışmaz.

#!/bin/bash 
set -e 
ls -l no_file & 
sleep 100 

Arka plan işlemlerinin hataları nasıl ele alınır?

cevap

5

Komutu eşzamansız olarak başlatma (& ile) her zaman çıkış durumu 0'ı döndürür. Komutun gerçek çıkış durumunu almak için, yerleşik wait'u kullanın. Basit bir örnek: (çok faydalı olabilir) herhangi alt süreç için

$ (sleep 5; ls -l nofile) & 
[1] 3831 
$ echo $? 
0 
$ wait -n 
ls: cannot access 'nofile': No such file or directory 
[1]+ Exit 2     (sleep 5; ls --color=auto -l nofile) 
$ echo $? 
2 

wait -n bekler. Belirli bir süreç için beklemek istersen, yeniden başlattığınızda, PID yakalayabilir - bu özel değişken $! öyle - o PID bekleyin:

$ (sleep 5; ls -l nofile) & 
$ myjobpid=$! 
$ # do some other stuff in parallel 
$ wait ${myjobpid} 
ls: cannot access 'nofile': No such file or directory 
[1]+ Exit 2     (sleep 5; ls --color=auto -l nofile) 

Bash kılavuzun ilgili bölümünde başlıklı "Job control"

+0

PID için beklediğim çözüm tam olarak aradığım şey. Teşekkürler. – Marcin