Sabtu, 25 Oktober 2014

Wah, lama ga ngepost, bukan karena lupa sama kalian kok pembaca setia blog ini. Memang bulan Oktober ini agak melelahkan bagi saya sendiri dikarenakan banyaknya kegiatan organisasi dan padatnya mata kuliah.


Setelah sebelumnya kita membahas proses pada Sistem Operasi, sekarang kita akan membahas bagaimana dan apa saja yang terlibat dalam suatu proses di Linux, termasuk beberapa perintah-perintah dan definisi yang erat kaitannya.

PID

Seperti yang kita ketahui, setiap process di linux selalu ada Process ID atau yang biasa disebut PID. PID ini adalah berupa nomer atau suatu angka tertentu yang unik disetiap processnya. Jadi tidak ada process yang mempunyai PID yang sama.
PID berguna untuk menghentikan atau mengunci suatu process dari aplikasi atau service. Dengan PID ini kita bisa menghentikan atau kill suatu process dan juga bisa melakukan blocking process apabila aplikasi/service itu sudah running. Sehingga kita bisa membatasi suatu applikasi/service hanya berjalan dengan process yang kita tentukan ( tidak ada double process ). Dan juga masih banyak lagi kegunaan dari PID ini. Di Linux, PID bisa kita lihat dengan menggunakan perintah 
"ps". Tapi perintah ps ini menampilkan semua proses pada linux. Jadi kita harus memfilter lagi output dari ps untuk mendapatkan PID dari service yang kita inginkan.

Ada beberapa cara yang bisa dilakukan untuk memfilter PID dari ps. Salah satunya dengan menggunakan "grep" dan "awk" untuk mendapatkan PID yang diinginkan.
Contohnya:
# ps -ef | grep -i "firefox" | grep -v grep | awk '{print $2}'outputnya adalah PID number dari firefox.

Child, Parent dan Zombie Process serta Daemon

-Child proses merupakan proses yang dibuat oleh proses lain. Proses lain ini bisa kita sebut dengan parent proses. Pembuatan child proses sendiri menggunakan fungsi fork

-Parent proses adalah suatu proses yang mampu membuat suatu proses anak. Beberapa proses pada Linux memerlukan forking dari parent untuk membuat child proses. Setiap proses pada Linux pasti berawal dari parent proses. Tapi tidak semua proses memerlukan pembuatan child proses, karena ada suatu proses pada Linux yang bernama "Init" yang tidak berawal pada proses mana pun.

-Zombie proses adalah suatu proses yang terjadi karena child proses di exit namun parent prosesnya tidak tau tau child proses tersebut telah diterminate, hal ini bisa terjadi contohnya karena putusnya network.

-Daemon adalah suatu proses yang berjalan di backgroud, hal ini terjadi karena parent prosesnya sengaja dimatikan sehingga child proses tersebut masih bisa berjalan tanpa adanya terminal. Jadi seolah-olah seperti "daemon" atau hantu karena proses tersebut berjalan di background tanpa kita ketahui secara kasat mata.


Cara membuat Daemon


Berikut ini adalah beberapa cara untuk membuat daemon:

a. Forking dan pembunuhan Proses induk.

Langkah pertama dari pembuatan daemon adalah dengan menspawn proses menjadi induk dan anak dengan melakukan forking, kemudian membunuh proses induk. Seperti yang sudah saya jelaskan di atas membunuh parent proses akan membuat suatu proses sudah selesai di terminal

Contoh :

pid_t pid,sid;

pid=fork();

if(pid < 0)

{
        exit(EXIT_FAILURE);

}

if(pid > 0)

{
         printf("process_id of child process %d \n", pid);
         exit(EXIT_SUCCESS);

}

umask(0);
//(user mask) adalah sebuah command pada environment posix yang berfungsi untuk menset hak akses dari file yang akan dibuat oleh proses yang berjalan saat itu

b. Membuat proses bekerja secara independen

Daemon harus bekerja secara independen daripada proses-proses lain, termasuk juga proses yang menjalankannya. Langkah bisa dilakukan dengan memanggil fungsi setsid(), sehingga proses akan mendapatkan sebuah session ID yang baru.

Contoh :

  sid=setsid ();
  if(sid<0){
  exit(EXIT_FAILURE);
  }
  if((chdir("/"))<0){
  exit(EXIT_FAILURE);
  }

c. Menutup standar I/O deskriptor yang diwarisi

Untuk mencegah terjadinya intervensi dari user serta untuk pengamanan, maka standar I/O descriptor dan descriptor yang diwarisi dari proses induk harus ditutup. Ada 3 jenis standar I/O descriptor : STDIN (standar input), STDOUT (standar output), STDERR (standar error).

Contoh:

//menutup standar I/O yang diwarisi
  close(STDIN_FILENO);
  close(STDERR_FILENO);

d. Melakukan masking pada File Creation

Sebagian besar daemon bekerja dalam previlege super user. Daemon biasanya memproteksi setiap file yang dibuat, dengan alasan keamanan. Fungsi umask() akan mencegah file-file previleges yang tidak aman dalam setiap pembuatan file.

pid_t pid,sid;

pid=fork();

if(pid < 0)

{
        exit(EXIT_FAILURE);

}

if(pid > 0)

{
         printf("process_id of child process %d \n", pid);
         exit(EXIT_SUCCESS);

}

umask(0);


e. Running Directory

Directory kerja daemon haruslah sebuah directory yang selalu hidup. Bisa saja pada saat starting working directorynya pada saat itu berada pada user home. Karena daemon bekerja sampai sistem reboot, maka file sistem user directorynya takkan pernah bisa di unmount.

Contoh :

sid = setsid();

if(sid < 0)

{

exit(EXIT_FAILURE);

}

if((chdir(“/home/indra/Desktop/Data/”)) < 0)

{

exit(EXIT_FAILURE);

}

f. Mendengarkan signal

Sebenarnya tugas utama dari daemon adalah mendengatkan requst. Maka sidalam daemon haruslah terdapat pendangar signal yang dapat merespon ketika daemon dikirimi signal tertentu, hal ini dapat dilakukan dengan meamnggil fungsi signal() untuk menginstall sebuah signal listener. Perlu kita ketahui bahwa signal 15 (SIGTERM) dan signal 9 (SIGKILL) tidak dapat ditangkap oleh signal handler.


g. Metode Log File

Semua file ditulis kedalam sebuah file tertentu yang diatur oleh file konfigursi daemon tersebut. Melakukannya dengan memanggil fungsi fopen().

Contoh :

FILE *fp=NULL;
fp = fopen ("logfile.txt", "w+");






Contoh Program Daemon :







Berikut gambarnya setelah berhasil di jalankan :



Nah, dari gambar di atar forking telah berhasih dibuat menandakan Daemon berhasil dijalankan. Lalu kita ketikkan pada terminal "ps aux" untuk menampilkan segala proses yang berlangsung.


Daftar proses yang ditandai tersebut adalah daemon yang dijalankan tadi. Nah, lalu kita matikan daemon tersebut dengan "kill (nomor id prosesnya)"


Nah, sekian tutorial dari saya. Sekian terima kasih.

0 komentar:

Posting Komentar