2012-06-28 31 views
7

tôi đã kịch bản bash sau, chúng ta có thể gọi nó là script1.sh:Cách kiểm tra xem công việc nền có còn hoạt động không? (Bash)

#!/bin/bash 

exec ./script2.sh & 

sleep 5 

if job1 is alive then #<--- this line is pseudo-code! 
    exec ./script3.sh & 
    wait 
fi 

Như có thể thấy, kịch bản thực thi script2.sh như một công việc nền và sau đó chờ 5 giây (để script2.sh thể làm một số khởi tạo đồ đạc). Nếu khởi tạo thành công, công việc script2.sh sẽ vẫn còn hoạt động, trong trường hợp này tôi cũng muốn bắt đầu script3.sh đồng thời; nếu không, tôi chỉ muốn bỏ thuốc lá.

Tuy nhiên, tôi không biết cách kiểm tra xem công việc đầu tiên có còn hoạt động hay không, do đó là dòng mã giả. Vì vậy, những gì nên đi vào vị trí của nó?

+2

Nhân viên điều hành chạy sẽ không làm những gì bạn nghĩ. Nó sẽ thay thế quy trình hiện tại bằng một quy trình mới; các dòng sau trong tập lệnh của bạn sẽ không đạt được. –

Trả lời

9

Bạn có thể lấy PID của tác vụ nền gần đây nhất với $!. Sau đó, bạn có thể kiểm tra trạng thái thoát của ps để xác định xem PID cụ thể đó có còn trong danh sách quá trình hay không. Ví dụ:

sleep 30 & 
if ps -p $! >&-; then 
    wait $! 
else 
    jobs 
fi 
+2

Lệnh chính xác đó cho tôi lỗi ps: write error: Bad Filedescriptor – FORTRAN

+0

Điều này không phải lúc nào cũng hoạt động. Ví dụ, trong Alpine Linux, mặc định "ps" được ràng buộc với BusyBox, không hỗ trợ chuyển đổi -p. Sử dụng 'bash' được xây dựng như' jobs' là dễ dàng hơn. –

3

Tôi không chắc chắn exec làm việc với nền, vì nó thay thế hình ảnh của quá trình cha mẹ với điều đó của quá trình con, nếu không, nếu chúng ta giả sử bạn thoát khỏi exec, bạn muốn một cái gì đó như:

#!/bin/bash 
./script2.sh& 
pid1=$! 

if kill -0 $pid1; then 
    ./script3.sh& 
    pid3=$! 
    wait 
fi 
6

Bạn có thể kiểm tra nếu một tín hiệu là chuyển giao

./script2 & 
myPid=$! 
sleep 5 

if kill -0 "$myPid"; then 
    script3 & 
    wait 
fi 
0

có xem xét lệnh jobs; nó liệt kê tất cả các công việc đang chạy.

4

Để mở rộng về câu trả lời fduff của bạn có thể sử dụng jobs dựng sẵn:

if jobs %% 
    exec ./script3.sh & 
    wait 
fi 

jobs %% in ID việc làm của quá trình nền gần đây nhất (các "công việc hiện tại") và trả về 0 thành công hoặc 1 nếu không có công việc như vậy.

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