Pencarian di Google mengungkapkan cuplikan kode x2. Hasil pertama adalah resep kode ini yang memiliki banyak dokumentasi dan penjelasan, bersama dengan beberapa diskusi yang bermanfaat di bawahnya.
Namun, sampel kode lain , walaupun tidak mengandung begitu banyak dokumentasi, termasuk kode sampel untuk meneruskan perintah seperti mulai, berhenti dan mulai ulang. Ini juga membuat file PID yang berguna untuk memeriksa apakah daemon sudah berjalan dll.
Kedua sampel ini menjelaskan cara membuat daemon. Adakah hal tambahan yang perlu dipertimbangkan? Apakah satu sampel lebih baik daripada yang lain, dan mengapa?
Jawaban:
Solusi saat ini
Implementasi referensi PEP 3143 (pustaka proses daemon standar) sekarang tersedia sebagai python-daemon .
Jawaban historis
Contoh kode Sander Marechal lebih unggul daripada yang asli, yang awalnya diposting pada tahun 2004. Saya pernah berkontribusi daemonizer untuk Pyro, tetapi mungkin akan menggunakan kode Sander jika saya harus melakukannya lagi.
sumber
http://pypi.python.org/pypi/python-daemon
. Lebih terpercaya. Hanya satu contoh: cobalah memulai dua kali daemon yang sama denganpython-daemon
: kesalahan besar jelek. Dengan kode Sander: pemberitahuan yang bagus "Daemon sudah berjalan."quit()
metode yang dijalankan sebelum daemon dihentikan. Ini dia.Ada banyak hal yang perlu diperhatikan ketika menjadi proses daemon yang berperilaku baik :
mencegah core dumps (banyak daemon dijalankan sebagai root, dan core dumps dapat berisi informasi sensitif)
berperilaku benar di dalam
chroot
penjaramengatur UID, GID, direktori kerja, umask, dan parameter proses lainnya secara tepat untuk use case
melepaskan ditinggikan
suid
,sgid
hak istimewatutup semua deskriptor file terbuka, dengan pengecualian tergantung pada use case
berperilaku benar jika mulai dalam konteks yang sudah terpisah, seperti
init
,inetd
, dllmengatur penangan sinyal untuk perilaku daemon yang masuk akal, tetapi juga dengan penangan spesifik yang ditentukan oleh use case
mengarahkan aliran standar
stdin
,stdout
,stderr
karena proses daemon tidak lagi memiliki terminal pengendalimenangani file PID sebagai kunci penasehat koperasi, yang merupakan keseluruhan kaleng cacing itu sendiri dengan banyak cara yang bertentangan tetapi valid untuk berperilaku
memungkinkan pembersihan yang tepat ketika proses dihentikan
sebenarnya menjadi proses daemon tanpa mengarah ke zombie
Beberapa di antaranya adalah standar , seperti yang dijelaskan dalam literatur Unix kanonik ( Pemrograman Lanjutan di Lingkungan UNIX , oleh almarhum W. Richard Stevens, Addison-Wesley, 1992). Lainnya, seperti aliran redirection dan penanganan file PID , adalah perilaku konvensional yang diharapkan sebagian besar pengguna daemon tetapi kurang standar.
Semua ini dicakup oleh spesifikasi “Perpustakaan proses daemon standar” PEP 3143 . The python-daemon implementasi referensi bekerja pada Python 2,7 atau lambat, dan Python 3.2 atau yang lebih baru.
sumber
Inilah daemon Python dasar 'Howdy World' yang saya mulai dengan, ketika saya sedang mengembangkan aplikasi daemon baru.
Perhatikan bahwa Anda membutuhkan
python-daemon
pustaka. Anda dapat menginstalnya dengan:Maka mulailah saja dengan
./howdy.py start
, dan hentikan dengan./howdy.py stop
.sumber
daemon
modul Anda mengimpor bukan merupakan bagian standar dari Python (belum). Perlu diinstal denganpip install python-daemon
atau setara.Perhatikan paket python-daemon yang memecahkan banyak masalah di belakang daemon di luar kotak.
Di antara fitur-fitur lain yang dimungkinkan untuk (dari deskripsi paket Debian):
sumber
Alternatif - buat program Python normal yang tidak di-daemonisasi, kemudian ubah secara eksternal menggunakan supervisord . Ini dapat menghemat banyak sakit kepala, dan * nix- dan bahasa-portabel.
sumber
Mungkin bukan jawaban langsung untuk pertanyaan, tetapi systemd dapat digunakan untuk menjalankan aplikasi Anda sebagai daemon. Berikut ini sebuah contoh:
Saya lebih suka metode ini karena banyak pekerjaan yang dilakukan untuk Anda, dan kemudian skrip daemon Anda berperilaku serupa dengan seluruh sistem Anda.
-Orby
sumber
systemctl start control.service
YapDi adalah modul python yang relatif baru yang muncul di Hacker News. Terlihat cukup berguna, dapat digunakan untuk mengubah skrip python menjadi mode daemon dari dalam skrip.
sumber
karena python-daemon belum mendukung python 3.x, dan dari apa yang bisa dibaca di milis, mungkin tidak akan pernah, saya telah menulis implementasi baru PEP 3143: pep3143daemon
pep3143daemon harus mendukung setidaknya python 2.6, 2.7 dan 3.x
Ini juga berisi kelas PidFile.
Perpustakaan hanya tergantung pada perpustakaan standar dan pada modul enam.
Ini dapat digunakan sebagai pengganti drop untuk python-daemon.
Ini dokumentasinya .
sumber
Fungsi ini akan mengubah aplikasi menjadi daemon:
sumber
Saya khawatir modul daemon yang disebutkan oleh @Dustin tidak bekerja untuk saya. Sebagai gantinya saya menginstal python-daemon dan menggunakan kode berikut:
Berlari itu mudah
hanya untuk kelengkapan di sini adalah konten direktori samplemodule
Konten moduleclass.py bisa
sumber
Satu hal lagi yang perlu dipikirkan ketika melakukan daemonisasi dengan python:
Jika Anda menggunakan python logging dan Anda ingin terus menggunakannya setelah melakukan daemonisasi, pastikan untuk memanggil
close()
penangan (terutama penangan file).Jika Anda tidak melakukan ini, pawang masih dapat berpikir bahwa ia memiliki file yang terbuka, dan pesan Anda akan hilang begitu saja - dengan kata lain pastikan logger mengetahui file-nya ditutup!
Ini mengasumsikan ketika Anda daemonise Anda menutup SEMUA deskriptor file terbuka tanpa pandang bulu - alih-alih Anda bisa mencoba menutup semua kecuali file log (tapi biasanya lebih mudah untuk menutup semua lalu buka kembali yang Anda inginkan).
sumber
Meskipun Anda mungkin lebih suka solusi Python murni yang disediakan oleh modul python-daemon, ada
daemon(3)
fungsi dilibc
- setidaknya, pada BSD dan Linux - yang akan melakukan hal yang benar.Memanggilnya dari python itu mudah:
Satu-satunya hal yang tersisa untuk dilakukan adalah membuat (dan mengunci) file-PID. Tetapi Anda dapat menangani diri sendiri ...
sumber
Saya memodifikasi beberapa baris dalam contoh kode Sander Marechal (disebutkan oleh @JeffBauer dalam jawaban yang diterima ) untuk menambahkan
quit()
metode yang dijalankan sebelum daemon dihentikan. Ini terkadang sangat berguna.Ini dia.
Catatan: Saya tidak menggunakan modul "python-daemon" karena dokumentasinya masih hilang (lihat juga banyak pertanyaan SO lainnya) dan agak tidak jelas (bagaimana memulai / menghentikan dengan benar daemon dari baris perintah dengan modul ini?)
sumber
Setelah beberapa tahun dan banyak upaya (saya mencoba semua jawaban yang diberikan di sini, tetapi semuanya memiliki kelemahan kecil pada akhirnya), sekarang saya menyadari bahwa ada cara yang lebih baik daripada ingin memulai, berhenti, restart daemon langsung dari Python : gunakan alat OS sebagai gantinya.
Misalnya, untuk Linux, alih-alih melakukan
python myapp start
danpython myapp stop
, saya melakukan ini untuk memulai aplikasi:atau
screen -dmS myapp python myapp.py
untuk memulai dan melepaskannya dalam satu perintah .Kemudian:
untuk melampirkan ke terminal ini lagi. Begitu sampai di terminal, dimungkinkan untuk menggunakan CTRL + C untuk menghentikannya.
sumber
Cara termudah untuk membuat daemon dengan Python adalah dengan menggunakan kerangka kerja berbasis peristiwa Twisted . Ini menangani semua hal yang diperlukan untuk daemonisasi untuk Anda. Ini menggunakan Pola Reaktor untuk menangani permintaan bersamaan.
sumber
80% dari waktu, ketika orang mengatakan "daemon", mereka hanya menginginkan server. Karena pertanyaannya benar-benar tidak jelas dalam hal ini, sulit untuk mengatakan apa kemungkinan domain jawaban itu. Karena server memadai, mulailah dari sana. Jika sebenarnya "daemon" benar-benar diperlukan (ini jarang terjadi), baca terus
nohup
sebagai cara untuk daemonisasi server.Sampai saat daemon yang sebenarnya benar-benar diperlukan, cukup tulis server yang sederhana.
Lihat juga implementasi referensi WSGI .
Lihat juga Server HTTP Sederhana .
"Apakah ada hal tambahan yang perlu dipertimbangkan?" Ya. Sekitar sejuta hal. Protokol apa? Berapa banyak permintaan? Berapa lama untuk melayani setiap permintaan? Seberapa sering mereka akan tiba? Apakah Anda akan menggunakan proses khusus? Utas? Subproses? Menulis daemon adalah pekerjaan besar.
sumber
fork()
, apalagi dua. Mereka tidak ada hubungannya dengan daemonisasi.crond
atausyslogd
- melakukan layanan tata graha untuk seluruh sistem. Untuk membuat proses daemon, setidaknya seseorang harus melakukan double-fork()
dengan semua deskriptor file ditutup, sehingga seseorang kebal terhadap sinyal dari semua terminal pengendali, termasuk konsol sistem. Lihat jawaban bignose.SimpleHTTPServer
memang merupakan server, tetapi server yang tidak tahu cara memonemonisasi dirinya sendiri (misalnya, Anda dapat Ctrl-C).nohup
adalah utilitas untuk daemonize proses naif - sehingga server nohupped Anda memang baik daemon dan server, persis seperti yang Anda klaim. Pertanyaan Stack Overflow ini pada dasarnya bertanya: "Bagaimana saya bisa menerapkannohup
dengan Python?"nohup
ini adalah alat yang baik, dan saya akan menghapus -1 suara saya jika Anda hanya memindahkan ide yang berguna ke dalam jawaban Anda yang sebenarnya. Bahkan, jika Anda menyebutkansupervisord
dan bagaimana hal itu juga akan menyelamatkan penulis dari keharusan melakukan pencatatan, skrip start-stop, dan memulai kembali pembatasan, maka saya bahkan akan memberi Anda +1. :)