Jalankan kembali skrip aplikasi saat macet?

18

Saya memiliki beberapa aplikasi yang harus dijalankan di laptop saya setiap saat.

Saya menggunakan skrip bash untuk memulai aplikasi ini. Dalam skrip saya, saya memiliki loop yang terlihat mirip dengan ini:

while true;
do
    xterm
done

Ini menjalankan aplikasi ( xtermdalam hal ini) dan jika aplikasi macet, loop memulai lagi.

Ini memiliki kelemahan bahwa tidak ada jalan keluar "bersih" dari loop ini. Jadi, bahkan jika tujuan pengguna adalah untuk menutup xterm, loop memulai lagi.

Apakah ada cara untuk memulai aplikasi dari skrip bash, perhatikan apakah skalanya sedang berjalan, untuk menjalankannya kembali jika skrip macet atau tidak melakukan apa-apa jika pengguna menutupnya dengan benar?

Dictador
sumber

Jawaban:

30

Coba ini:

while true; do xterm && break; done

Aplikasi memiliki kode status keluar sehingga jika sesuatu keluar dengan baik itu mengembalikan nol ... Dan jika ada yang salah, ia mengeluarkan nomor lain. Ini memungkinkan orang untuk terhubung dan mencari tahu masalah yang sebenarnya. Inilah yang dilakukan jawaban lain.

&&hanya memeriksa bahwa perintah sebelumnya adalah status-nol keluar dan jika itu, istirahat loop. Jika crash, itu akan membuang sesuatu selain 0 dan && ...klausa tidak akan memicu; itu hanya akan berputar kembali dan berjalan xterm.

Cyrus
sumber
6
Cukup elegan.
Oli
Hmm .. Sebaliknya juga:while xterm; do true; done
muru
1
@uru: Ini bekerja untuk saya:while ! xterm; do :; done
Cyrus
1
@ Ayrus Ah, ya. lupa !.
muru
Saya telah menciptakan monster. Bagaimana saya membunuhnya?
Tony Ruth
6

Dalam whilekondisi ini Anda dapat menguji apakah status keluar xtermberhasil atau tidak dengan sesuatu seperti ini:

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

$? variabel memegang status keluar dari perintah yang terakhir dieksekusi.

Leonid V. Fedorenchik
sumber
0

Saya akan menyarankan Anda untuk menggunakan.

sampai xterm; jangan gema "program berakhir dengan status $?" ; selesai

Ini akan menjalankan kembali program Anda jika terbunuh.

Aravind Ekan
sumber
0

Coba gunakan supervisor itu sangat sederhana dan mudah untuk menambahkan program atau skrip untuk dijalankan . Jika Anda sesedikit yang Anda butuhkan commanddan mungkin exitcodesdi bagian programx untuk mengkonfigurasi.

Default exitcodesadalah 0,2 sehingga artinya:

supervisord akan memulai kembali proses jika keluar dengan kode keluar yang tidak ditentukan dalam daftar ini

Secara umum itu yang Anda inginkan: jalankan kembali jika skrip macet atau tidak melakukan apa-apa jika pengguna menutupnya dengan benar (atau skrip berhasil diselesaikan)

coba konfigurasi paling sederhana terlebih dahulu:

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

Untuk lebih fleksibel lihat konfigurasi File dokumentasi.

Максим Шатов
sumber