Saya telah menulis skrip Python yang memeriksa alamat email tertentu dan meneruskan email baru ke program eksternal. Bagaimana saya bisa membuat skrip ini dieksekusi 24/7, seperti mengubahnya menjadi daemon atau layanan di Linux. Apakah saya juga memerlukan perulangan yang tidak pernah berakhir di program, atau dapatkah itu dilakukan hanya dengan menjalankan kembali kode beberapa kali?
175
systemd
Anda dapat membuat layanan systemd dalamdaemon
mode seperti dijelaskan di sini . Lihat juga: freedesktop.org/software/systemd/man/systemd.service.htmlJawaban:
Anda memiliki dua opsi di sini.
Buat pekerjaan cron yang tepat yang memanggil skrip Anda. Cron adalah nama umum untuk daemon GNU / Linux yang secara berkala meluncurkan skrip sesuai dengan jadwal yang Anda tetapkan. Anda menambahkan skrip Anda ke crontab atau menempatkan symlink ke dalamnya ke direktori khusus dan daemon menangani tugas meluncurkannya di latar belakang. Anda dapat membaca lebih lanjut di Wikipedia. Ada berbagai daemon cron yang berbeda, tetapi sistem GNU / Linux Anda seharusnya sudah diinstal.
Gunakan semacam pendekatan python (pustaka, misalnya) agar skrip Anda dapat mengubah bentuknya sendiri. Ya, itu akan memerlukan loop acara sederhana (di mana acara Anda memicu timer, mungkin, disediakan oleh fungsi tidur).
Saya tidak akan merekomendasikan Anda untuk memilih 2., karena Anda akan, pada kenyataannya, mengulangi fungsionalitas cron. Paradigma sistem Linux adalah membiarkan beberapa alat sederhana berinteraksi dan menyelesaikan masalah Anda. Kecuali ada alasan tambahan mengapa Anda harus membuat daemon (selain memicu secara berkala), pilih pendekatan lain.
Juga, jika Anda menggunakan daemonize dengan loop dan crash terjadi, tidak ada yang akan memeriksa email setelah itu (seperti yang ditunjukkan oleh Ivan Nevostruev dalam komentar untuk jawaban ini ). Sementara jika skrip ditambahkan sebagai tugas cron, itu hanya akan memicu lagi.
sumber
crontab
daftar? Jika saya mengaturnya.py
untuk setiap jam, apakah ini akan menciptakan banyak proses yang tidak akan pernah dihentikan? Jika demikian, saya pikir ini akan seperti daemon.Berikut kelas bagus yang diambil dari sini :
sumber
Anda harus menggunakan perpustakaan python-daemon , itu menangani semuanya.
Dari PyPI: Perpustakaan untuk menerapkan proses daemon Unix yang berperilaku baik.
sumber
Anda dapat menggunakan fork () untuk melepaskan skrip Anda dari tty dan membuatnya terus berjalan, seperti:
Tentu saja Anda juga perlu menerapkan loop tanpa akhir, seperti
Semoga ini bisa Anda mulai.
sumber
nohup
/disown
perintah akan melepaskan proses dari konsol dan tidak akan mati. Atau Anda bisa memulainya dengan init.dAnda juga dapat membuat skrip python dijalankan sebagai layanan menggunakan skrip shell. Pertama buat skrip shell untuk menjalankan skrip python seperti ini (nama arbiter scriptname)
sekarang buat file di /etc/init.d/scriptname
Sekarang Anda dapat memulai dan menghentikan skrip python Anda menggunakan perintah /etc/init.d/scriptname mulai atau berhenti.
sumber
Sebuah sederhana dan didukung versi adalah
Daemonize
.Instal dari Python Package Index (PyPI):
dan kemudian gunakan seperti:
sumber
cron
jelas merupakan pilihan tepat untuk banyak tujuan. Namun itu tidak membuat layanan atau daemon seperti yang Anda minta di OP.cron
hanya menjalankan pekerjaan secara berkala (artinya pekerjaan dimulai dan berhenti), dan tidak lebih dari satu kali / menit. Ada masalah dengancron
- misalnya, jika instance skrip Anda sebelumnya masih berjalan saatcron
jadwal berikutnya muncul dan meluncurkan instance baru, apakah itu OK?cron
tidak menangani dependensi; itu hanya mencoba untuk memulai pekerjaan ketika jadwal mengatakan.Jika Anda menemukan situasi di mana Anda benar-benar membutuhkan daemon (proses yang tidak pernah berhenti berjalan), lihatlah
supervisord
. Ini menyediakan cara sederhana untuk membungkus skrip atau program normal yang tidak di-daemonisasi dan membuatnya beroperasi seperti daemon. Ini adalah cara yang jauh lebih baik daripada membuat daemon Python asli.sumber
bagaimana kalau menggunakan
$nohup
perintah di linux?Saya menggunakannya untuk menjalankan perintah di server Bluehost saya.
Mohon saran jika saya salah.
sumber
Jika Anda menggunakan terminal (ssh atau sesuatu) dan Anda ingin agar skrip lama berfungsi setelah Anda keluar dari terminal, Anda dapat mencoba ini:
screen
apt-get install screen
buat terminal virtual di dalam (yaitu abc):
screen -dmS abc
sekarang kita terhubung ke abc:
screen -r abc
Jadi, sekarang kita dapat menjalankan skrip python:
python keep_sending_mails.py
mulai sekarang, Anda dapat langsung menutup terminal Anda, namun, skrip python akan tetap berjalan alih-alih ditutup
Jika Anda ingin kembali memeriksa status skrip Anda berjalan, Anda dapat menggunakannya
screen -r abc
lagisumber
Pertama, baca di email alias. Sebuah email alias akan melakukan ini di dalam sistem email tanpa Anda harus bermain-main dengan daemon atau layanan atau semacamnya.
Anda dapat menulis skrip sederhana yang akan dieksekusi oleh sendmail setiap kali pesan email dikirim ke kotak surat tertentu.
Lihat http://www.feep.net/sendmail/tutorial/intro/aliases.html
Jika Anda benar-benar ingin menulis server yang rumit dan tidak perlu, Anda dapat melakukan ini.
Hanya itu yang dibutuhkan. Script Anda hanya loop dan tidur.
sumber
do_the_work()
bisa crash script dan tidak ada yang menjalankannya lagitry
bagian gagal danexcept:
bagian akan dipanggil sebagai gantinya (dalam hal ini tidak ada) tetapi loop akan terus dan terus mencoba memanggil fungsi.Dengan asumsi bahwa Anda benar-benar ingin loop Anda dijalankan 24/7 sebagai layanan latar belakang
Untuk solusi yang tidak melibatkan menyuntikkan kode Anda dengan pustaka, Anda bisa membuat templat layanan, karena Anda menggunakan linux:
Tempatkan file itu di folder layanan daemon Anda (biasanya
/etc/systemd/system/
), dan instal dengan menggunakan perintah systemctl berikut (kemungkinan akan membutuhkan hak akses sudo):Anda kemudian dapat memeriksa apakah layanan Anda berjalan dengan menggunakan perintah:
sumber
Saya akan merekomendasikan solusi ini. Anda perlu mewarisi dan mengganti metode
run
.sumber
untuk membuat sesuatu yang berjalan seperti layanan, Anda dapat menggunakan hal ini:
Hal pertama yang harus Anda lakukan adalah menginstal Semen kerangka: bingkai Semen kerja adalah kerangka kerja CLI bahwa Anda dapat menyebarkan aplikasi Anda di atasnya.
antarmuka baris perintah aplikasi:
interface.py
Kelas YourApp.py:
Perlu diingat bahwa aplikasi Anda harus berjalan di utas untuk menjadi daemon
Untuk menjalankan aplikasi, cukup lakukan ini di baris perintah
sumber
Gunakan manajer layanan apa pun yang ditawarkan sistem Anda - misalnya di bawah Ubuntu gunakan pemula . Ini akan menangani semua detail untuk Anda seperti mulai saat boot, restart saat macet, dll.
sumber