Membuat skrip Bash yang akan menjalankan program dan jika keluar tanpa crash, akan menjalankannya lagi

8

Saya ingin tahu cara termudah untuk membuat skrip bash yang akan menjalankan aplikasi di MacOSX (ini adalah sistem berbasis UNIX jadi saya menganggap ini adalah tempat yang tepat). tunggu program untuk keluar. Jika jalan keluarnya tidak macet, jalankan lagi. Kalau tidak biarkan jendela laporan kerusakan terbuka dan keluar.

Saya ingin skrip ini berjalan selamanya sampai crash atau penghentian manual.

Saya punya ide yang kabur tetapi tidak yakin. Inilah yang saya miliki sejauh ini:

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
Ben Crazed Up Euden
sumber
Anda hampir pasti tidak ingin skrip dijalankan selamanya karena alasan apa pun. Anda ingin layanan - atau daemon - berjalan selamanya. Saya tidak tahu bagaimana mereka melakukannya pada Apel, tetapi Anda mungkin harus melihat sedikit lebih dekat pada sistem init Anda untuk mencari tahu apakah ada cara untuk mendaftarkan layanan dengannya. Biasanya daemon rexec sendiri secara berkala untuk memperbarui / menyimpan keadaan - mereka tidak mengulang selamanya, sungguh.
mikeserv

Jawaban:

12

Inilah yang dilakukan Bash saat loop :

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

Ini akan menjalankan aplikasi, dan jika itu berakhir dengan sukses menjalankan tubuh loop. :adalah perintah no-op shell (loop harus memiliki body, jadi itulah yang kita letakkan di sana); setelah itu kembali ke atas dan menjalankan program lagi. Jika gagal, loop berhenti berjalan dan skrip keluar.

Namun, sepertinya yang Anda jalankan mungkin aplikasi Mac biasa ( .app): ada beberapa masalah yang muncul dalam kasus itu. Salah satunya adalah bahwa Anda perlu menggunakan openperintah , daripada menjalankan direktori aplikasi langsung: open /path/to/application.app.

Yang lain adalah bahwa ketika Anda melakukannya openbiasanya akan segera berakhir dengan sukses, terlepas dari apa yang harus dilakukan aplikasi: itu tidak sepenuhnya universal, tetapi sebagian besar akan. Jika salah satu Anda tidak, Anda dapat menggunakan -Wopsi untuk memaksa openuntuk memblokir sampai ujung aplikasi: open -W /path/to/application.app. Perhatikan bahwa jika aplikasi sudah berjalan, ini akan menunggu sampai eksekusi yang ada juga berakhir.

Berapa banyak masalah yang tergantung pada aplikasi apa yang Anda jalankan. Jika itu tidak berfungsi dengan baik, melakukan ini dari shell mungkin bukan pilihan terbaik. Dalam hal ini Anda mungkin lebih baik menggunakan AppleScript, yang dapat Anda tanyakan di Ask Different .

Michael Homer
sumber
Saya punya aplikasi di mac yang sengaja macet dan saya sudah menguji solusi Anda di atas. itu akan secara otomatis me-restart aplikasi bahkan setelah crash. Apakah ada cara untuk memeriksa keluarnya aplikasi? karena terbuka jelas akan berakhir dengan keluar dari 0 sehingga akan berjalan lagi terlepas.
Ben Crazed Up Euden
@BenCrazedUpEuden: Pemahaman saya adalah bahwa openhanya mengembalikan kegagalan untuk kesalahan startup tertentu. Aplikasi dimulai oleh layanan sistem, bukan secara langsung, sehingga tidak ada saluran komunikasi langsung kembali. Kadang-kadang mungkin untuk memulai eksekusi aplikasi secara langsung: /Applications/YourProgram.app/Contents/MacOS/YourProgram. Kalau tidak, kami keluar dari Unix dan ke tempat-tempat Anda akan mendapatkan jawaban yang lebih baik pada Ask Different . Anda dapat menjalankan AppleScript dari shell denganosascript
Michael Homer
0

Saya sudah menguji ini:

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

Ini bekerja dengan menguji kode kembali perintah Anda, gaya POSIX. 0 berarti OK, hal lain dapat dianggap sebagai kesalahan.

fduff
sumber