Khởi chạy một quá trình nền và kiểm tra khi nó kết thúc


40

Làm cách nào tôi có thể khởi chạy một tiến trình trong nền và kiểm tra khi nào nó kết thúc trong tập lệnh bash? Ý tưởng của tôi là một kịch bản như thế này:

launch backgroundprocess &
while [ Process is running ];do
   echo "PROCESS IS RUNNING\r"
done;

echo "PROCESS TERMINATED"

Câu trả lời:


66

Chìa khóa là lệnh "chờ":

#!/bin/bash

/my/process &
/another/process &
wait
echo "All processes done!"

7
Lợi ích của việc này: nó KHÔNG đốt thời gian CPU với một vòng lặp vô hạn chạy mọi lúc ....;)
Pascal Schmiel

2
Nhược điểm của điều này là bạn không thể làm gì khác trong khi chờ đợi, chẳng hạn như chỉ ra tiến trình cho người dùng. Chỉ có giải pháp của cuonglm cho phép bạn làm điều này.
Đánh dấu gian hàng

3
@Mark Gian hàng Bạn có thể chỉ ra tiến trình với công việc không đồng bộ thứ ba. ví dụ:cmd1 & p=$!; cmd2 & q=$!; while sleep 1; do echo still running ; done& wait $p $q; kill $!;
William Pursell

32

Với waitbạn có thể có độ chi tiết bạn cần:

sleep 1 &
PID1=$!
sleep 2 &
PID2=$!

wait $PID1
echo 'PID1 has ended.'
wait
echo 'All background processes have exited.'

29

Đây là một cách để làm điều đó:

launch backgroundprocess &
PROC_ID=$!

while kill -0 "$PROC_ID" >/dev/null 2>&1; do
    echo "PROCESS IS RUNNING"
done
echo "PROCESS TERMINATED"
exit 0

2
Cảm ơn, đây chắc chắn là câu trả lời duy nhất trả lời cho cách giải thích của tôi về câu hỏi ban đầu (và lý do tại sao cuối cùng tôi lại nhìn vào câu hỏi này)
Mark Booth

@cuonglm, có nhiều quá trình là gì? Có lẽ waitlà phù hợp hơn cho điều đó?
Nishant

@cuonglm tùy chọn -0 để giết lệnh làm gì
k_vishwanath

1
@k_vishwanath nó báo cáo xem tiến trình có còn chạy hay không.
cuonglm

0

Bạn có thể chạy quy trình của mình với nohup và viết kịch bản shell để đọc tệp nohup.out mà nohup sử dụng để đăng nhập.

  nohup command &

4
(1) Có nguy cơ bị chẻ sợi tóc, nohupkhông viết bất cứ điều gì nohup.out; nó chỉ tạo tập tin và chuyển hướng đầu ra của lệnh tới nó. (2) Nếu lệnh không tạo ra bất kỳ đầu ra nào, sẽ không có gì được ghi vào nohup.outvà ý tưởng này sẽ không đi đến đâu. (3) Ngay cả khi commandghi đầu ra, làm thế nào bạn có thể biết khi nào nó kết thúc bằng cách theo dõi đầu ra đó?
G-Man nói 'Phục hồi Monica'

@ G-Man có thể bằng cách kiểm tra đầu ra của lsofxem nohupcó còn sử dụng không nohup.out, nhưng tôi đồng ý đây là một phương pháp rất nhiều lông.
Alexej Magura

(4) Đến lúc commandbắt đầu chạy, nohupđã biến mất. (1) Có, tôi đang lặp lại một con số, bởi vì tôi đang lặp lại những gì tôi đã nói hai năm trước: nohupkhông viết bất cứ điều gì nohup.out. (5) Có, bạn có thể viết một kịch bản shell để lặp và chạy lsofđể xem liệu nohup.outvẫn còn mở. Nhưng đó sẽ là một câu trả lời khác nhau. (6) Ngay cả khi bạn đã làm điều đó, nó sẽ không đáng tin cậy. Điều gì nếu một số quá trình khác mở nohup.outtập tin? Bạn thực sự muốn kiểm tra xem quy trình cụ thể này đã nohup.outmở chưa. (7) Nhưng, nếu bạn định làm điều đó, tại sao không kiểm tra xem quy trình có đang chạy không?
G-Man nói 'Phục hồi Monica'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.