Sepertinya Anda mencoba meluncurkan proses yang berjalan lama dari server web dan kemudian melacak proses tersebut dalam database. Itu bukan tidak mungkin, tetapi bukan praktik yang direkomendasikan.
Masalah utamanya adalah bahwa permintaan HTTP perlu ditangani saat ini di server web Anda karena Anda benar-benar melakukannya apa saja (termasuk melacak proses yang berjalan di sistem) -- Anda memerlukan sesuatu yang dapat berjalan sepanjang waktu...
Sebagai gantinya, ide yang lebih baik adalah memiliki proses "manajer" daemonisasi lainnya (seperti yang Anda sebutkan Perl, itu akan menjadi bahasa yang baik untuk menulisnya) menelurkan &melacak tugas yang berjalan lama (dengan PID dan sinyal), dan untuk itu proses untuk memperbarui database SQL Anda.
Anda kemudian dapat meminta proses "manajer" Anda mendengarkan permintaan untuk memulai proses baru dari server web Anda. Ada berbagai mekanisme IPC yang bisa Anda gunakan. (misalnya:sinyal, SysV shm, soket domain unix, antrian dalam proses seperti ZeroMQ, dll).
Ini memiliki banyak manfaat:
- Jika skrip yang Anda buat perlu dijalankan dengan isolasi berbasis pengguna/grup (baik dari sistem atau satu sama lain), maka server web Anda tidak perlu dijalankan sebagai root, atau disetel.
- Jika proses yang muncul "crash", sinyal akan dikirimkan ke proses "manager", sehingga proses tersebut dapat melacak kesalahan eksekusi tanpa masalah.
- Jika Anda menggunakan antrian dalam proses (misalnya:ZeroMQ) untuk mengirimkan permintaan ke proses "manajer", itu dapat "memperlambat" permintaan dari server web (sehingga pengguna tidak dapat secara sengaja atau tidak sengaja menyebabkan D.O.S).
- Apakah proses yang muncul berakhir dengan baik atau tidak, Anda tidak memerlukan permintaan HTTP 'aktif' ke server web untuk memperbarui basis data pelacakan Anda.
Seperti apakah sesuatu yang seharusnya berjalan sedang berjalan, itu benar-benar terserah semantik Anda. (yaitu:apakah ini didasarkan pada waktu berjalan yang diketahui? berdasarkan data yang dikonsumsi? dll).
Periksa apakah itu adalah lari bisa dua kali lipat:
- Proses "manajer" memperbarui database sebagaimana mestinya, termasuk PID yang muncul.
- Kode yang dihosting server web Anda sebenarnya dapat mencantumkan proses untuk menentukan apakah PID dalam database sebenarnya berlari, dan bahkan berapa lama ia telah melakukan sesuatu yang berguna!
Periksa apakah itu tidak berjalan harus didasarkan pada konvensi:
- Beri nama proses yang muncul sebagai sesuatu yang dapat Anda prediksi.
- Dapatkan daftar proses untuk menentukan apa yang masih berjalan (tidak berfungsi?) yang seharusnya tidak.
Dalam kedua kasus tersebut, Anda dapat memberi tahu pengguna yang meminta proses tersebut dilakukan dan/atau benar-benar melakukan sesuatu tentang hal itu.
Salah satu pendekatan mungkin memiliki pekerjaan CRON yang membaca dari database SQL dan melakukan ps
untuk menentukan proses yang muncul mana yang perlu dimulai ulang, dan kemudian meminta kembali agar proses "manajer" melakukannya menggunakan mekanisme IPC yang sama yang digunakan oleh server web. Bagaimana Anda membedakan mulai vs. memulai ulang dalam pelacakan/pemantauan/logging terserah Anda.
Jika server itu sendiri kehilangan daya atau mogok, maka Anda dapat meminta proses "manajer" melakukan pembersihan saat pertama kali dijalankan, mis:
- Cari entri dalam database untuk proses yang muncul yang diduga berjalan sebelum server dimatikan.
- Periksa proses tersebut dengan PID dan waktu berjalan (ini penting).
- Memunculkan kembali proses yang belum selesai, atau menyimpan sesuatu di database untuk menunjukkan ke server web bahwa ini masalahnya.
Perbarui #1
Sesuai komentar Anda, berikut adalah beberapa petunjuk untuk memulai:
Anda menyebutkan Perl, jadi anggaplah Anda memiliki kecakapan di sana -- berikut adalah beberapa modul Perl untuk membantu Anda dalam menulis skrip proses "manajer":
Jika Anda belum terbiasa dengannya CPAN adalah repositori untuk modul Perl yang pada dasarnya melakukan apa saja.
Daemon::Daemonize - Untuk melakukan daemonisasi agar proses tetap berjalan setelah Anda logout. Juga menyediakan metode untuk menulis skrip untuk memulai/menghentikan/memulai ulang daemon.
Proc::Spawn
- Membantu dengan 'spawning' skrip anak. Pada dasarnya tidak fork()
lalu exec()
, tetapi juga menangani STDIN/STDOUT/STDERR (atau bahkan tty) dari proses anak. Anda dapat menggunakan ini untuk meluncurkan skrip perl yang sudah berjalan lama.
Jika kode front-end server web Anda belum ditulis dalam perl, Anda memerlukan sesuatu yang cukup portabel untuk pengiriman pesan dan antrian antar-proses; Saya mungkin akan membuat server web Anda menjadi yang terdepan dalam sesuatu yang mudah diterapkan (seperti PHP).
Berikut adalah dua kemungkinan (ada banyak lainnya):
- Perl dan PHP implementasi untuk Toolkit Penyebaran .
- Perl dan PHP implementasi untuk ZeroMQ perpustakaan.
Proc::ProcessTable - Anda dapat menggunakan pemeriksaan ini pada proses yang sedang berjalan (dan mendapatkan semua jenis statistik seperti yang dibahas di atas).
Waktu::HiRes - Gunakan fungsi waktu dengan granularitas tinggi dari paket ini untuk mengimplementasikan kerangka kerja 'pelambatan' Anda. Pada dasarnya, batasi saja jumlah permintaan yang Anda de-queue per unit waktu.
DBI (dengan mysql ) - Perbarui database MySQL Anda dari proses "manajer".