Yosh saya akan share ilmu mengenai manajemen proses pada linux serta pembuatan daemon menggunakan bahasa C.
Konsep Proses pada Sistem Linux
Proses adalah program tunggal yang sedang dalam keadaan dieksekusi pada alamat virtual. Process merupakan keadaan ketika sebuah program sedang di eksekusi. Setiap proses juga memiliki PID atau Process ID yang merupakan nomor unik yang dapat digunakan untuk berinteraksi dengan proses bersangkutan.
Cara menampilkan process tersebut adalah dengan mengetik "ps" (tanpa tanda petik di terminal)
Untuk melihat faktor/elemen lainnya, gunakan option –u (user).
Mencari proses lainnya gunakan opsi a, au dan aux
Melihat proses yang sedang berjalan
Menghentikan suatu proses/job
Cara Membuat Daemon
Ada 6 proses pembuatan Daemon
1. Fork Parent Processs dan penghentian Parent Process Langkah pertama dari pembuatan daemon adalah menspawn proses menjadi induk dan anak dengan melakukan forking, kemudian membunuh proses induk. Proses induk yang mati akan menyebabkan sistem operasi mengira bahwa proses telah selesai
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().
3. 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.
Berikut contoh implementasi daemon secara lengkap
Konsep Proses pada Sistem Linux
Proses adalah program tunggal yang sedang dalam keadaan dieksekusi pada alamat virtual. Process merupakan keadaan ketika sebuah program sedang di eksekusi. Setiap proses juga memiliki PID atau Process ID yang merupakan nomor unik yang dapat digunakan untuk berinteraksi dengan proses bersangkutan.
Cara menampilkan process tersebut adalah dengan mengetik "ps" (tanpa tanda petik di terminal)
Untuk melihat faktor/elemen lainnya, gunakan option –u (user).
Mencari proses lainnya gunakan opsi a, au dan aux
Melihat proses yang sedang berjalan
Menghentikan suatu proses/job
- kill %<nomor job> contoh : kill %1
- kill <PID> contoh : kill 1908
- pkill <nama proses> contoh : pkill firefox
- pkillall <nama proses> contoh : pkillall firefox
Cara Membuat Daemon
Ada 6 proses pembuatan Daemon
1. Fork Parent Processs dan penghentian Parent Process Langkah pertama dari pembuatan daemon adalah menspawn proses menjadi induk dan anak dengan melakukan forking, kemudian membunuh proses induk. Proses induk yang mati akan menyebabkan sistem operasi mengira bahwa proses telah selesai
pid_t pid, sid; pid=fork(); if (pid < 0){ exit(EXIT_FAILURE); } if (pid > 0){ //catat PIP proses anak ke sebuah file exit(EXIT_SUCCESS); } //jika pembuatan proses berhasil, maka parent proses akan dimatikan2. 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().
3. 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.
sid = setsid();
if(sid<0){
exit(EXIT_FAILURE);
}
4.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);
}
5. 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(STDERR_FILENO);
clode(STDOUT_FILENO);
6. Membuat Loop utama (inti kerja dari daemon)
Daemon bekerja dalam jangka waktu tertentu, sehingga diperlukan sebuah looping.
while(1){
sleep(5)
}
exit(EXIT_SUCCES);
Berikut contoh implementasi daemon secara lengkap
#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> #include <dirent.h> int main(){ pid_t pid, sid; pid=fork(); if (pid < 0){ exit(EXIT_FAILURE); } if (pid > 0){ //catat PIP proses anak ke sebuah file exit(EXIT_SUCCESS); } umask(0); sid = setsid(); if(sid<0){ exit(EXIT_FAILURE); } if((chdir("/"))<0) { exit(EXIT_FAILURE); } close(STDIN_FILENO); close(STDERR_FILENO); close(STDOUT_FILENO); while(1){ sleep(30); } exit(EXIT_SUCCESS); }Lalu bagaimana contoh penerapannya pada sebuah aplikasi?. Oke saya akan membuatkan contohnya. Saya akan membuat program daemon untuk memindahkan secara otomatis file pada sebuah directory. Berarti hanya terdapat file berekstensi tertentu saja di sebuah direktori. Pada pemrograman bahasa C kita harus menambahkan sebuah file header untuk membaca direktori yaitu dirent.h Berikut kodingannya untuk memindah file selain .doc ke folder lain
DIR *dp; struct dirent *ep; //open folder direktorinya dp = opendir ("/home/exod/contoh/"); if (dp != NULL) { while (ep = readdir (dp)){ char namanya[100], temp[100]; /*periksa apakah file tersebut mengandung ekstensi .doc periksa panjang string dan cari .doc dalam string*/ int len = strlen (ep->d_name); if ((len >= 2) && strcmp (&(ep->d_name[len - 4]), ".doc") != 0){ /*tentukan alamat asal dan tujuan direktori lalu pindahkan file selain .doc ke folder lain dengan fungsi rename*/ snprintf(namanya,sizeof(namanya),"/home/exod/contoh/%s",ep->d_name); snprintf(temp,sizeof(temp),"/home/exod/bukandoc/%s", ep->d_name); rename(namanya,temp); } } (void) closedir (dp); } else perror ("Couldn't open the directory");
Cukup sekian tutorial yang dapat saya bagi hari ini. Jika ada kesalahan saya mohon maaf. Semoga bermanfaat :)