Chạy lại một kịch bản ứng dụng khi nó gặp sự cố?


18

Tôi có một số ứng dụng cần chạy trên máy tính xách tay của mình mọi lúc.

Tôi sử dụng một tập lệnh bash để bắt đầu các ứng dụng này. Trong kịch bản của tôi, tôi có một vòng lặp trông giống như thế này:

while true;
do
    xterm
done

Điều này chạy một ứng dụng ( xtermtrong trường hợp này) và nếu ứng dụng gặp sự cố, vòng lặp sẽ khởi động lại nó.

Điều này có một nhược điểm là không có lối ra "sạch" từ vòng lặp này. Vì vậy, ngay cả khi ý định của người dùng là đóng xterm, vòng lặp sẽ bắt đầu lại.

Có cách nào để khởi động một ứng dụng từ bash script, xem nó đang chạy, để chạy lại nếu script bị lỗi hoặc không làm gì nếu người dùng đóng nó đúng cách?

Câu trả lời:


30

Thử đi:

while true; do xterm && break; done

Các ứng dụng có mã trạng thái thoát để nếu một cái gì đó thoát ra tốt, nó sẽ trả về 0 ... Và nếu có lỗi, nó sẽ ném ra một số khác. Điều này cho phép mọi người kết nối và tìm ra vấn đề chính xác. Đây là những gì câu trả lời khác đang làm.

&&chỉ cần kiểm tra xem lệnh trước đó có phải là thoát trạng thái không và nếu có, sẽ phá vỡ vòng lặp. Nếu nó gặp sự cố, nó sẽ ném ra thứ gì đó khác 0 và && ...mệnh đề sẽ không kích hoạt; nó chỉ đơn giản là lặp lại xung quanh và chạy xterm.


6
Điều đó khá thanh lịch.
Oli

Hmm .. Cách khác cũng vậy:while xterm; do true; done
muru

1
@muru: Điều này hiệu quả với tôi:while ! xterm; do :; done
Cyrus

1
@Cyrus À, vâng. quên !.
muru

Tôi đã tạo ra một con quái vật. Làm thế nào để tôi giết nó?
Tony Ruth

6

Trong whileđiều kiện bạn có thể kiểm tra xem trạng thái thoát của xtermthành công hay không bằng một cái gì đó như thế này:

result=1
while [ $result -ne 0 ]; do
    xterm
    result=$?
done

$? biến giữ trạng thái thoát của lệnh thực thi cuối cùng.


0

Tôi sẽ đề nghị bạn sử dụng.

cho đến khi xterm; làm echo "chương trình kết thúc với trạng thái $?" ; làm xong

Điều này sẽ chạy lại chương trình của bạn nếu nó bị giết.


0

Hãy thử sử dụng trình giám sát , rất đơn giản và dễ dàng để thêm chương trình hoặc tập lệnh để chạy . Trong trường hợp bạn là tối thiểu bạn cần commandvà có thể exitcodestrong phần chương trình để cấu hình.

Mặc định exitcodeslà 0,2 nên có nghĩa là:

giám sát viên sẽ khởi động lại quá trình nếu nó thoát với mã thoát không được xác định trong danh sách này

Nói chung, đó là điều bạn muốn: chạy lại nếu tập lệnh bị hỏng hoặc không làm gì nếu người dùng đóng nó đúng cách (hoặc tập lệnh hoàn thành thành công)

Hãy thử cấu hình đơn giản nhất trước:

[program:you_app_name]
command=/path/to/you/app

Để linh hoạt hơn, xem cấu hình Tài liệu tệp .

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.