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 myserver
dalam satu until
lingkaran. Baris pertama dimulai myserver
dan menunggu sampai akhir. Ketika itu berakhir, until
periksa 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
, until
akan 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 myserver
dan crash segera, Anda akan memiliki loop yang sangat intensif untuk memulai dan crash terus-menerus di tangan Anda. Yang sleep 1
menghilangkan ketegangan dari itu.
Sekarang yang perlu Anda lakukan adalah memulai skrip bash ini (secara tidak serempak, mungkin), dan itu akan memonitor myserver
dan 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 @reboot
aturan. 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 myserver
memulai 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 foo
PID ke/var/run/foo.pid
- Beberapa saat kemudian:
foo
entah bagaimana mati.
- Beberapa saat kemudian: setiap proses acak yang dimulai (sebut saja
bar
) membutuhkan PID acak, bayangkan ia mengambil foo
PID lama.
- Anda perhatikan
foo
hilang: /etc/init.d/foo/restart
membaca /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.
ps
sangat 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
ps
mengarah ke BANYAK positif palsu. Ambil ps aux | grep PID
contoh, 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.