Daemon
Definisi Daemon
Daemon adalah proses yang berjalan di balik layar (background) dan tidak berinteraksi langsung dengan user melalui standard input/output.
Cara Membuat Daemon
Ada 6 proses pembuatan Daemon
Proses Pembuatan Daemon
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
int main(void)
{
pid_t pid,
sid;
pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
umask(0);
sid=setsid();
if(sid < 0)
{
exit(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
exit(EXIT_FAILURE);
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
while (1)
{
sleep(30);
}
exit(EXIT_SUCCESS);
}
Daemon adalah proses yang berjalan di balik layar (background) dan tidak berinteraksi langsung dengan user melalui standard input/output.
Ada 6 proses pembuatan Daemon
- Fork Parent Processs dan penghentian Parent Process
- Mengubah mode file menggunakan UMASK(0);
- Membuat Unique Session ID (SID)
- Mengubah Directory Kerja
- Menutup File Descriptor Standar
- Membuat Loop utama (inti kerja dari daemon)
Proses Pembuatan Daemon
- Fork Parent Process dan penghentian Parent Process
Langkah pertama adalah melakukan forking untuk membuat process baru kemudian mematikan Parent Process. Process induk yang mati akan membuat system mengira proses telah selesai sehingga akan kembali ke terminal user. Proses anak yang melanjutkan program setelah proses induk dimatikan.
Kodingan dalam C seperti ini
pid_t pid;
pid = fork();
if (pid < 0) {
exit(EXIT_FAILURE);
}
if (pid > 0) {
exit(EXIT_SUCCESS);
} //Jika pembuatan proses berhasil maka, parent proses akan langsung dimatikan - Mengubah mode file menggunakan UMASK(0);
Untuk menulis beberapa file (termasuk logs) yang dibuat oleh daemon, mode file harus diubah untuk memastikan bahwa file tersebut dapat ditulis dan dibaca secara benar. Pengubahan mode file menggunakan implementasi umask().
//mengubah mode file mask
umask(0); //mendapat akses penuh dari file yang akan dibuat daemon - Membuat Unique Session ID (SID)
Child Process harus memiliki unik SID dari kernel untuk dapat beroperasi. Sebaliknya, Child process menjadi Orphan Proses pada system. Tipe pid_t yang dideklarasikan pada bagian sebelumnya, juga digunakan untuk membuat SID baru untuk child process. Pembuatan SID baru menggunakan implementasi setsid(). Fungsi setsid() memiliki return tipe yang sama seperti fork().
sid = setsid();
if (sid < 0) {
exit(EXIT_FAILURE);
} - Mengubah Directory Kerja
Directori kerja yang aktif harus diubah ke suatu tempat yang telah pasti akan selalu ada. Pengubahan tempat direktori kerja dapat dilakukan dengan implementasi fungsi chdir (). Fungsi chdir() mengembalikan nilai -1 jika gagal.
if ((chdir("/")) < 0) {
exit(EXIT_FAILURE);
} - Menutup File Descriptor Standar
Salah satu dari langkah terakhir dalam mengeset daemon adalah menutup file descriptor standar (STDIN, STDOUT, STDERR). Karena daemon tidak perlu menggunakan kendali terminal, file descriptor dapat berulang dan berpotensi memiliki bahaya dalam hal keamanan. Untuk mengatasi hal tersebut maka digunakan implemtasi fungsi close().
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO); - Membuat Loop utama (inti kerja dari daemon)
Daemon bekerja dalam jangka waktu tertentu, sehingga diperlukan sebuah looping.
while(1) {
sleep(30);
}
exit(EXIT_SUCCESS);
Contoh Implementasi Daemon
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
int main(void)
{
pid_t pid,
sid;
pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
umask(0);
sid=setsid();
if(sid < 0)
{
exit(EXIT_FAILURE);
}
if ((chdir("/")) < 0) {
exit(EXIT_FAILURE);
}
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);
while (1)
{
sleep(30);
}
exit(EXIT_SUCCESS);
}
Contoh permasalahan:
Kita ingin membuat sebuah direktori yang berisi file yang berekstensi doc saja,
Untuk masalah di atas, saya menyelesaikannya dengan membuat direktori baru dengan nama doc. Caranya adalah dengan mkdir doc. Lalu saya akan mencari file yang berekstensi doc dan memindahkan file tersebut dari tempat asalnya ke direktori doc yang baru saya buat.
Kodingannya kurang lebih seperti ini
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>
int main(void)
{
pid_t pid,
sid;
pid = fork();
if (pid < 0)
{
exit(EXIT_FAILURE);
}
if (pid > 0)
{
exit(EXIT_SUCCESS);
}
umask(0);
sid=setsid();
if(sid < 0)
{
exit(EXIT_FAILURE);
}
close(STDERR_FILENO);
system("mkdir doc"); //Membuat direktori baru bernama doc
while (1)
{
system("find . -name '*.doc' -exec mv {} ~/doc/ ';'");
//Mencari file berekstensi doc dan memindah file tersebut ke folder doc yang telah dibuat sebelumnya
//Mencari file berekstensi doc dan memindah file tersebut ke folder doc yang telah dibuat sebelumnya
}
exit(EXIT_SUCCESS);
}
Kodingan diatas dibuat dengan ekstensi .c dan masuk ke terminal di linux dan ubah file .c tersebut jadi object berekstensi .o dengan cara gcc (nama file).c -o (nama file).o lalu jalankan file tersebut dengan cara ./(nama file).o maka semua file .doc anda akan berpindah ke satu direktori baru bernama doc.
Sekian postingan dari saya, apabila kurang jelas bisa tanya, terima kasih..
Comments
Post a Comment