Hindari PID-file, crons, atau apa pun yang mencoba untuk mengevaluasi proses yang bukan anak-anak mereka.
Ada alasan yang sangat bagus mengapa di UNIX, Anda HANYA dapat menunggu anak-anak Anda. Metode apa pun (ps parsing, pgrep, menyimpan PID, ...) yang mencoba untuk mengatasi yang cacat dan memiliki lubang menganga di dalamnya. Katakan saja tidak .
Alih-alih, Anda membutuhkan proses yang memantau proses Anda untuk menjadi induk proses. Apa artinya ini? Ini berarti hanya proses yang memulai proses Anda yang dapat menunggu hingga berakhir. Dalam bash, ini benar-benar sepele.
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
Sepotong kode bash di atas berjalan myserverdalam satu untillingkaran. Baris pertama dimulai myserverdan menunggu sampai akhir. Ketika itu berakhir, untilperiksa status keluarnya. Jika status keluar adalah 0, itu berarti berakhir dengan anggun (yang berarti Anda memintanya untuk ditutup, dan berhasil). Dalam hal ini kami tidak ingin memulai kembali (kami hanya meminta untuk mematikan!). Jika status keluar tidak 0 , untilakan menjalankan loop body, yang memancarkan pesan kesalahan pada STDERR dan me-restart loop (kembali ke baris 1) setelah 1 detik .
Mengapa kita menunggu sebentar? Karena jika ada sesuatu yang salah dengan urutan startup myserverdan crash segera, Anda akan memiliki loop yang sangat intensif untuk memulai dan crash terus-menerus di tangan Anda. Yang sleep 1menghilangkan ketegangan dari itu.
Sekarang yang perlu Anda lakukan adalah memulai skrip bash ini (secara tidak serempak, mungkin), dan itu akan memonitor myserverdan memulai kembali sesuai kebutuhan. Jika Anda ingin memulai monitor saat boot (membuat server "hidup" reboot), Anda dapat menjadwalkannya di cron pengguna Anda (1) dengan sebuah @rebootaturan. Buka aturan cron Anda dengan crontab:
crontab -e
Kemudian tambahkan aturan untuk memulai skrip monitor Anda:
@reboot /usr/local/bin/myservermonitor
Kalau tidak; lihat inittab (5) dan / etc / inittab. Anda dapat menambahkan baris di sana untuk myservermemulai pada level init tertentu dan direspawn secara otomatis.
Edit.
Biarkan saya menambahkan beberapa informasi tentang mengapa tidak menggunakan file PID. Meskipun mereka sangat populer; mereka juga sangat cacat dan tidak ada alasan mengapa Anda tidak hanya melakukannya dengan cara yang benar.
Pertimbangkan ini:
Daur ulang PID (membunuh proses yang salah):
/etc/init.d/foo start: mulai foo, tulis fooPID ke/var/run/foo.pid
- Beberapa saat kemudian:
fooentah bagaimana mati.
- Beberapa saat kemudian: setiap proses acak yang dimulai (sebut saja
bar) membutuhkan PID acak, bayangkan ia mengambil fooPID lama.
- Anda perhatikan
foohilang: /etc/init.d/foo/restartmembaca /var/run/foo.pid, memeriksa untuk melihat apakah masih hidup, menemukan bar, berpikir itu foo, membunuhnya, memulai yang baru foo.
File PID menjadi basi. Anda perlu logika yang terlalu rumit (atau harus saya katakan, non-sepele) untuk memeriksa apakah file PID sudah basi, dan logika seperti itu lagi rentan 1..
Bagaimana jika Anda bahkan tidak memiliki akses tulis atau berada dalam lingkungan baca-saja?
Komplikasi yang tidak ada gunanya; lihat betapa sederhananya contoh saya di atas. Tidak perlu mempersulit itu sama sekali.
Lihat juga: Apakah file-PID masih cacat saat melakukannya 'benar'?
Ngomong-ngomong; bahkan lebih buruk dari file PID yang diuraikan ps! Jangan pernah melakukan ini.
pssangat tidak bisa diport. Meskipun Anda menemukannya di hampir setiap sistem UNIX; argumennya sangat bervariasi jika Anda menginginkan keluaran non-standar. Dan output standar HANYA untuk konsumsi manusia, bukan untuk penguraian scripted!
- Parsing
psmengarah ke BANYAK positif palsu. Ambil ps aux | grep PIDcontoh, dan sekarang bayangkan seseorang memulai proses dengan nomor di suatu tempat sebagai argumen yang sama dengan PID yang Anda lihat dengan dasmon Anda! Bayangkan dua orang memulai sesi X dan Anda mengambil X untuk membunuh X Anda. Itu semua jenis yang buruk.
Jika Anda tidak ingin mengelola sendiri prosesnya; ada beberapa sistem yang sangat baik di luar sana yang akan bertindak sebagai monitor untuk proses Anda. Lihat ke runit , misalnya.