Tạo một tập lệnh Bash sẽ thực thi một chương trình và nếu nó thoát mà không gặp sự cố, sẽ chạy lại nó


8

Tôi muốn biết cách dễ nhất để tạo một tập lệnh bash sẽ chạy một ứng dụng trong MacOSX (đó là một hệ thống dựa trên UNIX vì vậy tôi cho rằng đây là nơi phù hợp). chờ chương trình thoát ra Nếu lối ra không phải là sự cố, hãy chạy lại. Nếu không, hãy để cửa sổ báo cáo sự cố mở và thoát.

Tôi muốn tập lệnh này chạy mãi cho đến khi sự cố hoặc chấm dứt thủ công.

Tôi có một ý tưởng mơ hồ nhưng không chắc chắn. Đây là những gì tôi có cho đến nay:

echo "Launching Autorun…"

if ["$1" -eq "0"]; then
# Application exited successfully. Restarting.
/path/to/application.app
else
# An error occured. Do nothing and exit.
    exit
fi

bạn gần như chắc chắn không muốn một kịch bản chạy mãi mãi vì bất kỳ lý do gì. bạn muốn một dịch vụ - hoặc một daemon - chạy mãi mãi. Tôi không biết làm thế nào họ làm điều đó trên Táo, nhưng có lẽ bạn nên xem xét kỹ hơn một chút về hệ thống init của bạn để tìm hiểu xem có cách nào để đăng ký dịch vụ với nó không. Thông thường, daemon tự rexec định kỳ để cập nhật / lưu trạng thái - thực sự chúng không lặp.
mikeerv

Câu trả lời:


12

Đây là những gì Bash trong khi các vòng lặp làm:

while /path/to/application.app
do
    :
done

Nó sẽ chạy ứng dụng và nếu nó chấm dứt chạy thành công phần thân của vòng lặp. :lệnh no-op của shell (vòng lặp phải có phần thân, vì vậy đó là những gì chúng ta đặt ở đó); sau đó nó trở lại đầu trang và chạy lại chương trình. Nếu thất bại, vòng lặp dừng chạy và tập lệnh thoát.

Tuy nhiên, có vẻ như những gì bạn đang chạy có thể là một ứng dụng Mac thông thường ( .app): có một số vấn đề xuất hiện trong trường hợp đó. Một là bạn cần sử dụng openlệnh , thay vì chạy trực tiếp thư mục ứng dụng : open /path/to/application.app.

Mặt khác là khi bạn làm openthường sẽ chấm dứt ngay lập tức với một thành công, bất kể ứng dụng tiếp tục làm gì: điều đó không hoàn toàn phổ biến, nhưng hầu hết sẽ. Nếu bạn làm như vậy, bạn có thể sử dụng -Wtùy chọn để buộc openchặn cho đến khi ứng dụng kết thúc : open -W /path/to/application.app. Lưu ý rằng nếu ứng dụng đã chạy, điều này sẽ đợi cho đến khi việc thực thi hiện tại cũng chấm dứt.

Bao nhiêu vấn đề bất kỳ trong số đó phụ thuộc vào ứng dụng bạn đang chạy. Nếu nó không chơi tốt, làm điều này từ vỏ có thể không phải là lựa chọn tốt nhất. Trong trường hợp đó, có lẽ bạn nên sử dụng AppleScript, điều mà bạn có thể hỏi về Hỏi khác .


Tôi đã có một ứng dụng trên mac có thể cố tình gặp sự cố mà tôi đã thử nghiệm giải pháp trên của bạn. nó sẽ tự động khởi động lại ứng dụng ngay cả sau khi gặp sự cố. Có cách nào để kiểm tra lối ra của ứng dụng không? vì mở rõ ràng sẽ chấm dứt với lối ra bằng 0 nên sẽ chạy lại bất kể.
Ben Crazing Up Euden

@BenCraenedUpEuden: Hiểu biết của tôi là openchỉ trả về thất bại cho một số lỗi khởi động nhất định. Các ứng dụng được khởi động bởi một dịch vụ hệ thống, không trực tiếp, do đó không có kênh liên lạc trực tiếp nào. Đôi khi, có thể bắt đầu ứng dụng thực thi trực tiếp : /Applications/YourProgram.app/Contents/MacOS/YourProgram. Mặt khác, chúng ta đang trôi ra khỏi Unix và đến những nơi bạn sẽ nhận được câu trả lời tốt hơn trên Hỏi khác . Bạn có thể chạy AppleScript từ trình bao vớiosascript
Michael Homer

0

Tôi đã thử nghiệm điều này:

#!/bin/bash
while <your_cmd_here>
do
    true
done

Điều này hoạt động bằng cách kiểm tra mã trả về của lệnh của bạn, kiểu POSIX. 0 có nghĩa là Ok, bất cứ điều gì khác có thể được coi là một lỗi.

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.