Sabtu, 17 Oktober 2015

PROSES DAN DAEMON

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
  1. kill %<nomor job> contoh : kill %1
  2. kill <PID> contoh : kill 1908
  3. pkill <nama proses> contoh : pkill firefox
  4. pkillall <nama proses> contoh : pkillall firefox
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

   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 dimatikan
     2. 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 :)

    0 komentar:

    Posting Komentar

    luvne.com resepkuekeringku.com desainrumahnya.com yayasanbabysitterku.com