Holaa piye kabare semua? semoga baik baik wae aamiin.
Kali ini gue bakal jelasin proses dan daemon di linux
Process adalah keadaan ketika sebuah program sedang di eksekusi. Cara menampilkan process tersebut adalah dengan mengetik "ps" (tanpa tanda petik di terminal)
Daemon merupakan background proses yang di design agar dapat menjalankan suatu proses secara otomatis karena tidak memiliki terminal pengontrol, dengan sedikit atau tanpa hubungan langsung dengan pengguna.
Sedangkan cara membuat daemon yaitu ada 6 langkah :
1. Fork Parent Processs dan penghentian Parent Process
2. Mengubah mode file menggunakan UMASK(0);
3. Membuat Unique Session ID (SID)
4. Mengubah Directory Kerja
5. Menutup File Descriptor Standar
6. Membuat Loop utama (inti kerja dari daemon)
Proses Pembuatan Daemon
1. Forking dan Kill 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 sehingga akan kembali ke terminal user.
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. Pembuatan SID baru menggunakan implementasi
setsid(). Fungsi setsid() memiliki return tipe yang sama seperti fork().
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.
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().
6. Membuat Loop utama (inti kerja dari daemon)
Daemon bekerja dalam jangka waktu tertentu, sehingga diperlukan sebuah
looping.
Contoh 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);
}
Sekarang penjelasan sedikit
PID (Process ID)
berupa nomer atau suatu angka tertentu yang unik di setiap process nya.
Untuk mendapatkan PID :
System call getpid()
PPID (Parent Process ID)
Parent Process ID. Induk dari Process ID (PID). Setiap proses memiliki satu induk proses (PPID). PPID adalah creator dari proses. PPID adalah PID yang bersifat Private, atau PID yang tidak langsung ditampilkan
Untuk mendapatkan PPID :
System call getppid()
Parent Process
Proses yang menciptakan beberapa proses anak. Proses ini tercipta dengan mengeksekusi fungsi fork(), kemudian hasil dari pemanggilan fork tersebut menciptakan beberapa child process. Untuk mematikan parent process kita bisa mengetikkan kill lalu di ikuti oleh angka dari parent process yang ingin di matikan.
Implementasi pembuatan forking parent (proses
pembuatan child) :
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
pid_t child_pid ;
child_pid = fork();
if(child_pid<0){
printf(“Create New Process Failed!!!”);
}
if(child_pid > 0){
printf(“Parent Process with id %d”, (int)getpid() );
}
return 0;
}
Child Process
Proses yang dibuat oleh proses lainnya ( parent process ). Setiap proses bisa membuat banyak proses anak tapi hanya akan memiliki satu parent process, kecuali unuk proses paling pertama yang tidak memiliki parent. Proses pertama yang dipanggil init dalam Linux, dimulai oleh kernel saat boot dan tidak pernah dihentikan.
Implementasi pembuatan proses child:
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
int main()
{
pid_t child_pid ;
child_pid = fork();
if(child_pid<0){
printf(“Create Child Process Failed!!!”);
}
if(child_pid == 0){
printf(“Child Process with id : %d \n”, (int) getpid() );
}
return 0;
}
Zombie Process
Proses pada system operasi yang telah telah menyelesaikan prosesnya tetapi terdapat pada entry proses. Zombie proses terjadi apabila child process diberi perintah kill atau prosesnya dihentikan, child proses kemudian memberikan signal SIGCHILD ke parent process, apabila parent proess tidak menghandle signal tersebut, maka child process tersebut akan menjadi Zombie Process. Sebenarnya proses telah berhenti namun seakan-akan tetap ada. Zombie process ditandai dengan <defunct>.
Orphan Process
Proses yang terjadi apabila Parent processnya telah berhenti dieksekusi tetapi child process tetap berjalan
Sekarang disini gue mau kasih 1 contoh daemon yang menunjukan seluruh proses dari user yang sedang login begini :
#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(){
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(STDERR_FILENO);
register uid_t uid;
while(1){
system("ps -aux | grep -i $(whoami) | grep -v \"root\" > /home/glleen/proses.txt");
}
}
penjelasannya yaitu proses daemon seperti yang sudah dijelaskan di atas tadi, nah bagaimana cara kita ngeprint seluruh proses yang sedang berjalan dari user yang sedang login?
Pertama kita harus tau kalo untuk menampilkan proses itu kita bisa menjalankan perintah ps aux di terminal.
Nah untuk menampilkan user yang sedang login kita bisa menggunakan perintah whoami di terminal.
Setelah itu fungsi untuk mencari kata yaitu kita pakai fungsi grep dimana kita akan mencari nama user yg sedang login, dan hanya akan mencetak proses dari user yang sedang login saat ini saja.
Itu semua bakal disimpan dengan nama proses.txt (berdasarkan contoh).
Kita panggil perintah di atas tadi semua itu dengan perintah system.
Sekian dulu penjelasan kali ini dari gue, mohon maaf kalo ada salah-salah namanya jg manusia, makasih yaa udh mau baca sampe akhir.
No comments:
Post a Comment