Bagaimana cara mengawasi dan memulai kembali proses secara otomatis?

34

Saya ingin memiliki proses yang akan dimulai kembali jika macet. Saya googled sedikit dan menemukan bahwa solusi mudah adalah dengan menggunakan daemontools .

Saya tidak mengerti cara mengkonfigurasinya.

  1. Apa cara termudah untuk menyelesaikan fungsi seperti itu?
  2. Bagaimana cara mengkonfigurasinya?
opc0de
sumber

Jawaban:

29

Jawaban ini berlaku untuk versi Ubuntu dengan Upstart (<= 14.10). Gunakan pendekatan lain untuk versi dengan Systemd (> = 15.04).

Tampaknya Anda sedang mencari fungsionalitas yang sudah disediakan di Ubuntu dengan Upstart . The respawnbait di konfigurasi akan melakukan apa yang Anda butuhkan. Saya akan merekomendasikan menentang penggunaan cara yang kurang standar dalam menangani hal ini.

Tanpa rincian lebih lanjut tentang proses yang Anda coba kelola dengannya, sulit untuk mengatakan seperti apa konfigurasi itu. Itu tergantung pada apakah itu bercabang dan menempatkan dirinya di latar belakang misalnya. Dokumentasi pemula pada respawnbait harus memberi Anda informasi lebih lanjut.

Sayangnya, belum dimungkinkan untuk menjalankan Pekerjaan Pengguna dengan benar: tidak dapat memulai untuk menjalankan pekerjaan pengguna

Contoh

Mari kita asumsikan kita ingin tetap menjalankan aplikasi Kalkulator, bahkan ketika sedang dimatikan dengan api (sinyal 9).

  1. Buat file konfigurasi di /etc/init/calculator.conf(berdasarkan artikel ini ):

    #!upstart
    description "Calculator"
    
    # Start job via the daemon control script. Replace "gert" with your username.
    exec su -l gert -c 'export DISPLAY=:0; /usr/bin/gnome-calculator'
    
    # Restart the process if it dies with a signal
    # or exit code not given by the 'normal exit' stanza.
    respawn
    
    # Give up if restart occurs 10 times in 90 seconds.
    respawn limit 10 90
    
  2. Mulai dengan berlari

    sudo start calculator
    
  3. Ini terbuka pada tampilan Anda saat ini ( :0) dan nikmati kehebatannya dengan melihatnya memulai kembali setelah menutupnya.

    • Identifikasi ID proses, misalnya dengan melakukan ps aux | grep calculator:

      gert  13695 0.2 0.4 349744 16460 ?   Sl   13:38   0:00 /usr/bin/gnome-calculator
      
    • Matikan dengan api.

      sudo kill -9 13695
      
    • Tonton kembali:

      gert  16059 4.6 0.4 349736 16448 ?   Sl   13:40   0:00 /usr/bin/gnome-calculator
      

Perhatikan bahwa ini akan lebih elegan dengan paket untuk paket Ubuntu 13.04 dengan dukungan Pekerjaan Pengguna yang tepat.

gertvdijk
sumber
Saya mendapatkan pekerjaan yang tidak dikenal saat saya mencoba memulainya? ide apapun. saya telah meletakkan file di / etc / init
opc0de
@ opc0de Nama file servicename.confharus sesuai dengan perintah untuk memulai start servicename. Saya curiga Anda telah memilih nama yang berbeda.
gertvdijk
tidak, itu cocok tetapi saya tidak mengikuti contoh Anda jadi saya pikir saya mungkin memiliki kesalahan sintaksis.
opc0de
@ opc0de Baiklah, mulailah dengan menjelaskan lebih lanjut tentang apa yang ingin Anda capai dalam pertanyaan: jenis aplikasi / proses apa dan bagaimana Anda menjalankannya misalnya, serta detail tentang upaya Anda saat ini.
gertvdijk
Dipecahkan dengan contoh Anda kesalahan saya adalah bahwa saya mungkin memiliki kesalahan dalam statemen exec. Terima kasih atas bantuan Anda!
opc0de
13

Alat yang sangat sederhana yang dapat mencapai efek yang sama tanpa memerlukan konfigurasi adalah immortal: https://immortal.run/

Cukup jalankan perintah seperti ini:

immortal <cmd>

Ini akan berjalan di latar belakang dan memulai kembali secara otomatis jika keluar.

  • immortalctl: Lihat status menjalankan pekerjaan. Ada namekolom yang akan dicetak di sini, Anda dapat menggunakan ini untuk merujuk ke pekerjaan dengan perintah kontrol lainnya.
  • immortalctl stop <name>: Berhenti memantau pekerjaan dengan nama yang diberikan (itu tidak akan secara otomatis dimulai kembali, tetapi proses saat ini akan terus dijalankan)
  • immortalctl -k <name>: Mengirim SIGKILL ke proses saat ini.
  • immortalctl exit <name>: Berhenti memantau pekerjaan dengan nama yang diberikan dan menghapusnya dari daftar pekerjaan.
mesin ekstropik
sumber
1
Terima kasih, ini berfungsi baik untuk kasus penggunaan saya di 16.04. Menempatkan ini di tas saya alat yang berguna.
Quentin Skousen
2
Memang, ini terlihat lebih ringan daripada pemula / respawn.
Sridhar Sarnobat
Apakah ada cara untuk menampilkannya stdoutdan stderrdi latar depan?
David S.
Saya tidak menyadarinya, karena biasanya digunakan untuk menjalankan proses di latar belakang. Namun, Anda dapat menggunakan immortalctl -l out.log <cmd> && tail -f out.loguntuk mencapai efek yang sama.
mesin ekstropik
@ David. Anda bisa mendapatkan log gabungan atau memiliki stdout dan stderr immortal.run/post/stderr
nbari
1

Jika Anda tidak memerlukan fungsionalitas proses daemon / layanan / latar belakang dan hanya ingin melakukannya di konsol kemudian buat file bernama autorestart.sh:

#!/bin/bash

while [ 1 ]; do
  some_command
done

Maka ./autorestart.shsecara otomatis akan restart some_commandjika keluar atau crash. CTRL-C memutus loop dan keluar dari program dengan bersih.

Diuji pada Ubuntu 18.04.

Jan Święcki
sumber
0

Ada cara tanpa "pemula". Kata kuncinya adalah "inittab" :-). Meskipun itu file yang biasanya tidak diubah dari default, itu dapat digunakan untuk mencapai respawning yang diinginkan pada mesin SYSV.

cepal67
sumber
Saya tidak mengerti mengapa seseorang MENOLAK solusi ini. Jika Anda tidak memahaminya, cukup google saja; tidak ada gunanya untuk memotong dan menempel di sini halaman manual initttab, Anda dapat membacanya sendiri di sistem Anda! cukup ketik "man inittab" ...
cepal67
13
Rincian jawaban berkualitas tinggi lebih dari "gunakan ini, cari tahu sendiri" :)
Seth
0

ps-watcher adalah alat yang mengawasi proses mana yang sedang berjalan dan mengeksekusi suatu tindakan pada keadaan tertentu. Mari kita instal:

apt-get install ps-watcher

Lihat bagian bawah Menjalankan HHVM dengan fallback ke PHP-FPM untuk detail - ini telah bekerja dengan baik untuk saya.

Firegarden
sumber
Karena ini tidak terlalu lama, tambahkan ringkasan kode alih-alih artikel karena hanya bagian yang sangat pendek yang berlaku untuk pertanyaan ini.
derHugo