Sabtu, 17 Oktober 2015

[HOWTO] Mencatat Proses yang sedang Berjalan

Kali ini, saya akan berbagi mengenai cara mencatat setiap proses yang sedang berjalan dari user yang sedang aktif. Namun untuk melakukan itu, pertama-tama kita buat daemon dahulu. Daemonnya adalah 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);
    }

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

    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    while(1) {
        sleep(10);
     }

    exit(EXIT_SUCCESS);
}
Jangan lupa untuk membuat daemon tsb dalam file ekstensi c.
Untuk mengetahui proses yang sedang berjalan dari user yang sedang login kita bisa mengetikkan ps ux di terminal. Namun karena kita akan membuatnya di C, kita tidak bisa mengetikkan ps ux begitu saja. Kita perlu memanggil system. Nah cara mudahnya sebenarnya kita bisa menambahkan system("ps ux > logfile.txt") di dalam while(1). Tapi, di sini saya akan membuatnya dengan memadukan bahasa C. Penulisannyapun juga akan tetap dimasukkan di dalam while(1).

char path[1024];

        FILE *fp = popen("ps ux", "r");
        FILE *out= fopen("home/vania/C06_log.txt", "w+");
        if (fp == NULL)
        {
            perror("popen: ");
            exit(EXIT_FAILURE);
        }
        while (fgets(path, sizeof(path), fp) != NULL)
            fprintf(out,"%s", path);


        pclose(fp);  
        fclose(out);  
        sleep(10);

popen di atas adalah untuk menjalankan process di system. Jadi, nantinya output dari process tsb akan dimasukkan ke dalam sebuah file txt dengan nama C06_log.txt dan menyimpannya di direktori tsb . Untuk kodingan keseluruhannya adalah sebagai berikut :

#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) {
        char path[1024];

        FILE *fp = popen("ps ux", "r");
        FILE *out= fopen("home/vania/C06_log.txt", "w+");
        if (fp == NULL)
        {
            perror("popen: ");
            exit(EXIT_FAILURE);
        }
        while (fgets(path, sizeof(path), fp) != NULL)
            fprintf(out,"%s", path);


        pclose(fp);  
        fclose(out);  
        sleep(10);
    }

    exit(EXIT_SUCCESS);
}
Untuk menjalankan kodingan tersebut, di terminal kita ketikkan gcc -o proses proses.c (di sini saya menyimpan file tsb dengan proses.c). Lalu jalankan proses tsb dengan ./proses . Nantinya akan keluar C06_log.txt di direktori home dan akan terupdate setiap 10 detik. Jika ingin mengubah updateannya bisa diganti waktunya sesuai yang diinginkan di perintah sleep(). Jika ingin menghentikkan proses, bisa kita ketikkan pkill proses di terminal.
Sekian dan terima kasih.
Share:
Read More