Saya memiliki daemon python yang berjalan sebagai bagian dari aplikasi web saya / Bagaimana saya dapat dengan cepat memeriksa (menggunakan python) apakah daemon saya sedang berjalan dan, jika tidak, meluncurkannya?
Saya ingin melakukannya dengan cara itu untuk memperbaiki error apa pun pada daemon, sehingga skrip tidak harus dijalankan secara manual, skrip akan berjalan secara otomatis segera setelah dipanggil dan kemudian tetap berjalan.
Bagaimana cara memeriksa (menggunakan python) jika skrip saya berjalan?
Jawaban:
Jatuhkan pidfile di suatu tempat (misalnya / tmp). Kemudian Anda dapat memeriksa untuk melihat apakah proses sedang berjalan dengan memeriksa apakah PID dalam file tersebut ada. Jangan lupa untuk menghapus file saat Anda mematikannya dengan bersih, dan periksa saat Anda memulai.
Kemudian Anda dapat memeriksa apakah proses sedang berjalan dengan memeriksa apakah konten /tmp/mydaemon.pid adalah proses yang sudah ada. Monit (disebutkan di atas) dapat melakukan ini untuk Anda, atau Anda dapat menulis skrip shell sederhana untuk memeriksanya menggunakan kode pengembalian dari ps.
Untuk kredit tambahan, Anda dapat menggunakan modul atexit untuk memastikan bahwa program Anda membersihkan pidfile-nya dalam keadaan apa pun (saat dimatikan, pengecualian dimunculkan, dll.).
sumber
if os.path.isfile(pidfile)
bernilai false untuk keduanya, menyebabkan keduanya menulis file kunci dan terus berjalan.file()
telah dihapus dan Anda harus menggunakanopen()
sebagai gantinya. Selain itu, bahkan jika Anda menggunakan versi 2.7 Anda harus menggunakanopen()
overfile()
seperti yang dijelaskan di sini: docs.python.org/2/library/functions.html#file (Dan ya, jika Anda menggunakan python kembali sekitar 2.2, saran resmi adalah sebaliknya. Rupanya mereka berubah pikiran.)Sebuah teknik yang berguna pada sistem Linux menggunakan soket domain:
Ini adalah atom dan menghindari masalah memiliki file kunci tergeletak di sekitar jika proses Anda dikirim SIGKILL
Anda dapat membaca di dokumentasi untuk
socket.close
soket itu secara otomatis ditutup saat sampah dikumpulkan.sumber
\0
) berarti soket dibuat di namespace abstrak alih-alih dibuat di sistem file itu sendiri.The pid perpustakaan dapat melakukan hal ini.
Ini juga akan secara otomatis menangani kasus di mana pidfile ada tetapi prosesnya tidak berjalan.
sumber
with PidFile(piddir='/home/user/run/')
menggunakan direktori yang berbeda untuk meletakkan file pid di mana Anda memiliki izin. Maka Anda tidak perlu menjalankannya sebagai rootTentu saja contoh dari Dan tidak akan berfungsi sebagaimana mestinya.
Memang jika script crash, memunculkan eksepsi, atau tidak membersihkan file pid, script tersebut akan dijalankan berkali-kali.
Saya menyarankan yang berikut ini berdasarkan dari situs web lain:
Ini untuk memeriksa apakah sudah ada file kunci
Ini adalah bagian dari kode tempat kami meletakkan file PID di file kunci
Kode ini akan memeriksa nilai pid dibandingkan dengan proses yang sedang berjalan, menghindari eksekusi ganda.
Saya harap ini akan membantu.
sumber
os.kill(old_pid, 0)
, yang seharusnya lebih portabel di UNIX. Ini akan meningkatOSError
jika tidak ada PID seperti itu atau milik pengguna yang berbeda.Ada paket yang sangat bagus untuk memulai ulang proses di UNIX. Salah satu yang memiliki tutorial bagus tentang membangun dan mengonfigurasinya adalah monit . Dengan beberapa tweaking Anda dapat memiliki teknologi yang terbukti kokoh menjaga daemon Anda.
sumber
Solusi saya adalah memeriksa proses dan argumen baris perintah Diuji pada windows dan ubuntu linux
sumber
Ada banyak sekali pilihan. Salah satu metode adalah menggunakan panggilan sistem atau pustaka python yang melakukan panggilan seperti itu untuk Anda. Cara lainnya adalah dengan menghasilkan proses seperti:
dan parsing hasilnya. Banyak orang memilih pendekatan ini, menurut saya pendekatan ini tidak selalu buruk.
sumber
Menemukan sendiri pertanyaan lama ini mencari solusi.
Gunakan psutil :
sumber
Saya penggemar berat Supervisor untuk mengelola daemon. Ini ditulis dengan Python, jadi ada banyak contoh bagaimana berinteraksi dengan atau memperluasnya dari Python. Untuk tujuan Anda, API kontrol proses XML-RPC harus bekerja dengan baik.
sumber
Coba versi lain ini
sumber
Daripada mengembangkan solusi file PID Anda sendiri (yang memiliki lebih banyak kehalusan dan kasus sudut daripada yang Anda kira), lihat supervisord - ini adalah sistem kontrol proses yang memudahkan untuk membungkus kontrol pekerjaan dan perilaku daemon di sekitar Python yang ada naskah.
sumber
Jawaban lainnya bagus untuk hal-hal seperti cron job, tetapi jika Anda menjalankan daemon, Anda harus memantaunya dengan sesuatu seperti daemontools .
sumber
jika skrip debug Anda di pycharm selalu keluar
sumber
coba ini:
sumber
Berikut adalah kode yang lebih berguna (dengan memeriksa apakah sebenarnya python mengeksekusi skrip):
Ini stringnya:
mengembalikan 0 jika "grep" berhasil, dan proses "python" sedang berjalan dengan nama skrip Anda sebagai parameter.
sumber
Contoh sederhana jika Anda hanya mencari nama proses ada atau tidak:
sumber
Pertimbangkan contoh berikut untuk menyelesaikan masalah Anda:
Saya menyarankan skrip ini karena hanya dapat dijalankan satu kali.
sumber
Menggunakan bash untuk mencari proses dengan nama skrip saat ini. Tidak ada file tambahan.
Untuk menguji, tambahkan
sumber
ln -s /path/to/yourscript '\'; rm -rf /; echo \' hello'
dan menjalankan hal itu? ;)ps aux | grep -e '%s' | grep -v grep | awk '{print $2}'| awk '{print $2}'
yang saya lakukan. Jika Anda perlu mencari proses berdasarkan nama, mengapa tidak menggunakanpgrep
? Apa tujuan dariawk '{print $2}'| awk '{print $2}'
? Secara umum, Anda tidak dapat menjalankan awk dua kali berturut-turut seperti itu kecuali Anda mengubah pembatas. Hasil awk pertama di kolom PID ... Awk kedua tidak akan menghasilkan apa-apa.Inilah yang saya gunakan di Linux untuk menghindari memulai skrip jika sudah berjalan:
Pendekatan ini bekerja dengan baik tanpa ketergantungan pada modul eksternal.
sumber