Di Linux saya ingin menambahkan daemon yang tidak dapat dihentikan dan yang memantau perubahan sistem file. Jika ada perubahan yang terdeteksi, itu harus menulis jalur ke konsol tempat dimulainya ditambah baris baru.
Saya sudah memiliki kode untuk mengubah sistem file hampir siap tetapi saya tidak tahu cara membuat daemon.
Kode saya berasal dari sini: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
Apa yang harus dilakukan setelah bercabang?
int main (int argc, char **argv) {
pid_t pID = fork();
if (pID == 0) { // child
// Code only executed by child process
sIdentifier = "Child Process: ";
}
else if (pID < 0) {
cerr << "Failed to fork" << endl;
exit(1);
// Throw exception
}
else // parent
{
// Code only executed by parent process
sIdentifier = "Parent Process:";
}
return 0;
}
inotify
API. Lihat:inotify_init
,inotify_add_watch
,inotify_rm_watch
.Jawaban:
Daemon bekerja di latar belakang dan (biasanya ...) bukan milik TTY, itulah mengapa Anda tidak dapat menggunakan stdout / stderr dengan cara yang Anda inginkan. Biasanya daemon syslog ( syslogd ) digunakan untuk mencatat pesan ke file (debug, error, ...).
Selain itu, ada beberapa langkah yang diperlukan untuk membuat daemonisasi suatu proses.
Jika saya ingat dengan benar langkah-langkah ini adalah:
Untuk memberi Anda titik awal: Lihatlah kode kerangka ini yang menunjukkan langkah-langkah dasar. Kode ini sekarang juga dapat bercabang di GitHub: Kerangka dasar daemon linux
gcc -o firstdaemon daemonize.c
./firstdaemon
Periksa apakah semuanya berfungsi dengan baik:
ps -xj | grep firstdaemon
Outputnya harus serupa dengan yang ini:
Yang harus Anda lihat di sini adalah:
(karena garpu kedua ())
Membaca syslog:
/var/log/syslog
Lakukan:
grep firstdaemon /var/log/syslog
Outputnya harus serupa dengan yang ini:
Catatan: Pada kenyataannya Anda juga ingin menerapkan penangan sinyal dan mengatur logging dengan benar (File, level log ...).
Bacaan lebih lanjut:
sumber
fork()
, mengapa tidak digunakan sajasetsid()
?sigaction()
fungsi menyediakan mekanisme yang lebih komprehensif dan dapat diandalkan untuk mengendalikan sinyal; aplikasi baru harus digunakansigaction()
daripadasignal()
.man 7 daemon
menjelaskan cara membuat daemon dengan sangat detail. Jawaban saya hanyalah kutipan dari manual ini.Setidaknya ada dua jenis daemon:
SysV Daemons
Jika Anda tertarik dengan daemon SysV tradisional , Anda harus menerapkan langkah-langkah berikut :
Perhatikan peringatan ini:
Perhatikan bahwa
daemon()
tidak sesuai dengan POSIX .Daemon Gaya Baru
Untuk daemon gaya baru, langkah - langkah berikut disarankan:
Untuk mempelajari lebih lanjut baca utuh
man 7 daemon
.sumber
Anda tidak dapat membuat proses di linux yang tidak dapat dimatikan. Pengguna root (uid = 0) dapat mengirim sinyal ke suatu proses, dan ada dua sinyal yang tidak dapat ditangkap, SIGKILL = 9, SIGSTOP = 19. Dan sinyal lain (jika tidak tertangkap) juga dapat mengakibatkan penghentian proses.
Anda mungkin menginginkan fungsi daemonize yang lebih umum, di mana Anda dapat menentukan nama untuk program / daemon Anda, dan jalur untuk menjalankan program Anda (mungkin "/" atau "/ tmp"). Anda mungkin juga ingin menyediakan file untuk stderr dan stdout (dan mungkin jalur kontrol menggunakan stdin).
Berikut ini yang perlu di antaranya:
Dan inilah fungsi yang lebih umum,
Berikut adalah contoh program, yang menjadi daemon, hang sekitar, dan kemudian pergi.
Perhatikan bahwa SIG_IGN menunjukkan untuk menangkap dan mengabaikan sinyal. Anda bisa membuat penangan sinyal yang bisa mencatat tanda terima sinyal, dan menyetel tanda (seperti tanda untuk menunjukkan pematian yang lancar).
sumber
Coba gunakan
daemon
fungsinya:Dari halaman manual :
sumber
daemon(7)
manual menyebutkan langkah-langkah untuk membuat daemon dan memperingatkan bahwa: Fungsi BSDdaemon()
tidak boleh digunakan, karena hanya mengimplementasikan sebagian dari langkah-langkah ini.daemon
Fungsi pertama kali muncul di 4.4BSD dan tidak sesuai dengan POSIX .Saya dapat berhenti pada persyaratan pertama "Sebuah daemon yang tidak dapat dihentikan ..."
Tidak mungkin teman saya; namun, Anda dapat mencapai hal yang sama dengan alat yang jauh lebih baik, modul kernel.
http://www.infoq.com/articles/inotify-linux-file-system-event-monitoring
Semua daemon bisa dihentikan. Beberapa lebih mudah dihentikan daripada yang lain. Bahkan pasangan daemon dengan pasangan yang ditahan, menghidupkan kembali pasangan jika hilang, dapat dihentikan. Anda hanya perlu bekerja sedikit lebih keras untuk itu.
sumber
Jika aplikasi Anda adalah salah satu dari:
dan Anda tidak keberatan dengan dependensi NodeJS lalu instal NodeJS lalu:
Agar semua aplikasi tetap berjalan saat reboot (dan membuat daemonise pm2):
Sekarang kamu bisa:
(juga memungkinkan Anda dengan mudah untuk melihat perubahan kode di direktori aplikasi Anda dan otomatis memulai ulang proses aplikasi saat terjadi perubahan kode)
sumber
Dengan memanggil fork () Anda telah membuat proses anak. Jika garpu berhasil (garpu mengembalikan PID bukan nol) eksekusi akan dilanjutkan dari titik ini dari dalam proses anak. Dalam hal ini kami ingin keluar dari proses induk dengan anggun dan kemudian melanjutkan pekerjaan kami dalam proses anak.
Mungkin ini akan membantu: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
sumber
Daemon hanyalah sebuah proses di latar belakang. Jika Anda ingin memulai program Anda ketika OS melakukan boot, di linux, Anda menambahkan perintah start Anda ke /etc/rc.d/rc.local (jalankan setelah semua skrip lain) atau /etc/startup.sh
Di windows, Anda membuat layanan, mendaftarkan layanan, dan kemudian mengaturnya untuk memulai secara otomatis saat boot di administrasi -> panel layanan.
sumber
Template Daemon
Saya menulis template daemon mengikuti daemon gaya baru: link
Anda dapat menemukan seluruh kode template di GitHub: di sini
Main.cpp
Daemon.hpp
Daemon.cpp
daemon-template.service
sumber