2017-02-22 18 views
5

Trong tập lệnh của tôi, tôi đặt set -e để ngừng xử lý nếu xảy ra lỗi. Nó hoạt động tốt cho tất cả các lệnh chạy ở nền trước, nhưng một số lệnh của tôi phải được chạy song song trong nền. Thật không may nếu quá trình nền không thành công thì tập lệnh không bị dừng mặc dù cờ set -e.set -e và quá trình nền

Ví dụ về quy trình nền trước hoạt động.

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

Ví dụ về quy trình nền không hoạt động.

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

Làm cách nào để xử lý lỗi của quá trình nền?

Trả lời

5

Bắt đầu một lệnh không đồng bộ (với &) luôn trả về trạng thái thoát 0. Để có trạng thái thoát thực tế của lệnh, hãy sử dụng mã được dựng sẵn wait. Một ví dụ đơn giản:

$ (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 đợi bất kỳ quá trình con (mà có thể rất hữu ích). Nếu bạn muốn chờ đợi cho một quá trình cụ thể, bạn có thể nắm bắt được PID khi bạn bắt đầu nó - đó là trong biến đặc biệt $! - sau đó chờ đợi bởi PID:

$ (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) 

Các phần có liên quan của cuốn cẩm nang Bash có tiêu đề "Kiểm soát công việc"

+0

Giải pháp chờ đợi PID là điều hoàn hảo tôi đang tìm kiếm. Cảm ơn. – Marcin

Các vấn đề liên quan