/**********************************************************
Perl/Tk Clinic : ngekill-fe.pl - kill process(es)
di GNU/Linux
Released Sept,21,2005
by iko(iko_riyadi@yahoo.com)
www.geocities.com/iko94
***********************************************************/
Pernahkan anda merasa kesulitan "membunuh" program-program yang terasa mengganggu
kegiatan anda ber-linux-ria di X Window ? Mungkin masalah anda terselesaikan dengan bantuan
xkill, tetapi itupun terbatas juga untuk program-program yang kelihatan mata,
sedangkan untuk program-program yang tidak kelihatan mata seperti background process
ataupun program-program yang dijalankan oleh orang lain, harus dilihat dengan utility ps,
yang notabene akan sedikit membingungkan bagi pemula di linux.
Penulis berusaha membantu dengan sedikit menulis utility kecil dengan perl yang lumayan
enak dilihat mata dan tidak ribet menjalankannya. Anda bisa melihat screenshotnya
di www.geocities.com/iko94/ngekill.
Sekilas tampilannya memang ada miripnya dengan KDE System Guard, tapi lebih sederhana
dan ringan. Itulah tujuan utama aplikasi ini, sederhana dan ringan, sehingga bisa anda jalankan
di desktop manager yang sederhana seperti icewm, twm, dsb.
Program kecil ini terdiri atas 1 listbox, 3 label, 5 button dan 1 browse entry. Inti dari
program ini adalah memanfaatkan utility ps milik Linux untuk mendaftar keseluruhan proses
dari masing-masing user, lalu mengolah hasilnya. Tujuan yang diinginkan adalah membagi
hasil pengolahan tadi menjadi dua kategori, yaitu user atau proses. Terlebih dahulu user
harus memilih salah satu baris dari listbox yang ada, kemudian menekan tombol PILIH.
Setelah itu user harus menentukan pilihan dengan memilih kategori user atau proses di
browse entry.
Kategory user artinya proses kill akan dilakukan terhadap semua proses milik user.
Jika yang dipilih adalah user yang sama dengan pemakai program ini (di session ini juga tentunya),
maka user yang bersangkutan akan logoff dengan sendirinya, maka harus hati-hati dalam memilih
baris proses di listbox tersebut. Kategori proses artinya baris proses yang terpilih akan
dengan segera di-kill, dengan jalan menekan tombol *KILL*.
Proses kill di Linux dilakukan dengan mengirimkan sinyal yang kita inginkan ke PID yang
akan diproses. Daftar lengkap nama sinyal dapat anda peroleh dengan mengetikkan perintah kill -l
di terminal anda atau dengan mengekstrak hash %SIG di perl. Di program ini, sinyal yang kita
pakai adalah sinyal nomer nol dan sinyal nomer sembilan. Sinyal nomer 0 digunakan untuk
mengecek apakah PID yang dimaksud itu masih hidup atau sudah mengganti UID-nya. Tetapi
pengecekan ini bisa gagal apabila UID proses tidak identik dengan pengirim sinyal karena
anda mengalami masalah perijinan/permission (dalam pengiriman sinyal) walaupun sebenarnya
proses tersebut sebenarnya masih hidup. Maka dari itu kita gunakan hash %! untuk menentukan
sebab kegagalannya. Sinyal nomer 9 digunakan untuk membunuh PID yang telah dicek dan ternyata
masih hidup oleh sinyal nomer 0 tadi.
Untuk proses kill user di program ini, agak lebih panjang prosesnya, karena kita harus
mengumpulkan PID milik user yang akan kita kill prosesnya, dengan menggunakan regular
expression, yang kemudian kita masukkan hasilnya ke sebuah array. Satu per satu PID di
array tersebut akan dicek dulu dengan mengirimkan sinyal nomer 0, kemudian baru dikirimkan
sinyal nomer 9 apabila ternyata memang ada dan masih hidup. Jika ternyata gagal membunuh
proses yang dimaksud, maka akan ada pesan kesalahan.
Selebihnya, program ini berisi handle terhadap graphical user interface yang menggunakan
modul Tk. Berikut ini source code dari program ini.
****************awal ngekill-fe***************
#!/usr/bin/perl -w
# ngekill-fe - kill process(es) - front end
# Copyright (c) Sept 2005 Iko Riyadi .
# GPL.
use Tk;
use Tk::BrowseEntry;
$|=1;
$PROG=".::ngekill-fe.pl::.\nkill anyone who disturb you... :)\nanda harus selevel root !\n";
$AUTHOR="IKO RIYADI";
$EMAIL="";
$TAHUN="2005";
$LICENCE="GPL.";
my $TOP = MainWindow->new();
$TOP->configure(-title=>'MANAJEMEN PROSES');
$TOP->geometry('80x20+0+0');
$TOP->fontCreate(qw/C_vbig -family helvetica -size 48 -weight bold/);
sub about {
$TOP->messageBox(qw/-icon info -type OK -title ABOUT -message/
=> "$PROG\nCopyright (c) $TAHUN\n$AUTHOR\n$EMAIL\n$LICENCE\n\n");
}
my $label_atas = $TOP->Label(-width=>15,
-text=>'Daftar Proses :',
-font => C_vbig
)->pack();
my $list = $TOP->Scrolled(
qw/Listbox -width 78 -height 13 -setgrid 1 -scrollbars se/)->pack();
@rprocs=`ps caux`;
$list->insert(0,@rprocs);
my $label_bawah1 = $TOP->Label(-width=>70,
-text=>' ')->pack();
my $label_bawah2 = $TOP->Label(-width=>70,
-text=>' ')->pack();
sub kills_proses {
my $baris = shift;
my $p1d;
my $status_hidup;
my $status_mati;
if ($baris=~/\w+?\s+?([0-9]+)\s+?/) {
$p1d=$1;
$status_hidup=(kill(0,$p1d));
if ($status_hidup) {
$label_bawah1->configure(-text=>"Coba bunuh PID $p1d ... ");
$status_mati=kill(9,$p1d);
if ($status_mati) {
$label_bawah2->configure(-text=>"done...");
} else {
$label_bawah2->configure(-text=>"Gagal membunuh PID $p1d");
}
} elsif ($!{EPERM}) {
$label_bawah2->configure(-text=>"Anda memiliki masalah dengan permission! Gagal membunuh PID $p1d");
} else {
$label_bawah2->configure(-text=>"Sudah tak ada proses dengan PID $p1d");
}
} #end if ($baris=~/
else {$label_bawah2->configure(-text=>"Tak ada proses yang dipilih !");}
}
sub kills_user {
my $baris = shift;
my $user;
my @rprocs=`ps caux`;
my $baris_pid;
my @pids;
my $p1d;
my $ada;
my $status_hidup;
my $status_mati;
$baris=~/(\w+?)\s+?[0-9]+\s+?/;
if ($1) {
$user=$1;
foreach $baris_pid(@rprocs) {
if ($baris_pid=~/$user\s+?([0-9]+)\s+?/) {
push(@pids,$1);
}
}
if ($ada=@pids) {
print "Jumlah pid milik user *$user* = $ada \n\n";
} else {
warning ("tidak ada user *$user* yang berproses,\nsilahkan cek kembali...\n\n");
}
print "Daftar PID yang akan di kill :\n";
foreach $p1d(@pids) {
print "$p1d ";
}
print "\n\nSiap-siap ngekill user *$user* :\n\n";
sleep 2;
foreach $p1d(@pids) {
$status_hidup=(kill(0,$p1d));
#print $status_hidup;
if ($status_hidup) {
print "Coba bunuh PID $p1d ... ";
$label_bawah1->configure(-text=>"$user : coba bunuh PID $p1d ...");
$status_mati=kill(9,$p1d);
if ($status_mati) {
print "done...\n";
$label_bawah2->configure(-text=>"$user : done...");
} else {
print "Gagal membunuh PID $p1d\n";
$label_bawah1->configure(-text=>"$user : Gagal membunuh PID $p1d");
}
} elsif ($!{EPERM}) {
print "Anda memiliki masalah dengan permission! Gagal membunuh PID $p1d\n";
$label_bawah1->configure(-text=>"$user : Anda memiliki masalah dengan permission!");
} else {
print "Sudah tak ada proses dengan PID $p1d\n";
$label_bawah1->configure(-text=>"$user : Sudah tak ada proses dengan PID $p1d");
}
sleep 1;
}
print "Selesai....\n\n";
$label_bawah2->configure(-text=>"$user : Selesai ....");
} else {
$label_bawah2->configure(-text=>"Anda harus memilih salah satu proses di atas!");
}
}
my $bawah1 = $TOP->Frame->pack(qw/-side top -expand 1 -padx .5c -pady .5c/);
my $bawah2 = $TOP->Frame->pack(qw/-side bottom -expand 1/);
$bawah1->Button(-width=>15,
-text=>'Refresh',
-command => sub {$list->delete(0,'end');
$label_bawah1->configure(-text=>' ');
$label_bawah2->configure(-text=>' ');
@rprocs=`ps caux`;
$list->insert(0,@rprocs);
}
)->pack(qw/-side left -fill x -expand 1/);
$bawah1->Button(-width => 15,
-text=>'PILIH',
-command => sub {$label_bawah2->configure((-text=>' ');
$pilih=$list->curselection."\n";
if (!($pilih == '')) {
$baris=$list->get($pilih);
$label_bawah1->configure(-text=>"Pilihan : $baris");
} else {
$label_bawah1->configure(
-text=>'Anda harus memilih salah satu bariis proses !');
}
})->pack(qw/-side left -fill x -expand 1/);
my $pilihan = "user";
$bawah1->Button(-width=>15,
-text=>'*KILL*',
-command => sub {
if ($pilihan eq "proses") {
kills_proses($baris);
} elsif ($pilihan eq "user") {
kills_user($baris);
}
} #end sub
)->pack(qw/-side left -fill x -expand 1/);
my $c = $bawah1->BrowseEntry(-variable => \$pilihan, -state =>'readonly');
$c->pack(qw/-side left -fill x -expand 1/);
$c->insert("end", "user");
$c->insert("end", "proses");
$bawah2->Button(-width=>15,
-text=>'About',
-command => sub {
&about;
})->pack(qw/-side left -fill x -expand 1/);
$bawah2->Button(-width=>15,
-text=>'Keluar',
-command => sub {exit}
)->pack(qw/-side left -fill x -expand 1/);
MainLoop;
****************akhir ngekill-fe***************
Jika anda memang lebih senang bekerja di konsole atau x terminal, maka penulis
juga menyediakan versi command line dari ngekill ini, tetapi hanya terbatas pada kill
user saja. Anda bisa melihat screenshotnya di www.geocities.com/iko94/ngekill.
Berikut ini penulis sertakan source code dari versi command line-nya.
************awal ngekill.pl*********************
#!/usr/bin/perl -w
# ngekill - kill process(es) - command line version
# Copyright (c) Sept 2005 Iko Riyadi .
# GPL.
$|=1;
$PROG="\t\t.::ngekill.pl::.
\tkill anyone who disturb you... :)
\tanda harus selevel root !\n";
$AUTHOR="IKO RIYADI";
$EMAIL="";
$TAHUN="2005";
$LICENCE="\t\tGPL.";
print "$PROG\nCopyright (c) $TAHUN $AUTHOR $EMAIL\n$LICENCE\n\n";
$jum_arg=@ARGV;
die("usage $0 nama_user\n\n") if ($jum_arg < 1);
@rprocs=`ps caux`;
foreach $baris_pid(@rprocs) {
if ($baris_pid=~/$ARGV[0]\s+?([0-9]+)\s+?/) {
push(@pids,$1);
}
}
#$ada=@pids;
#print $ada;
if ($ada=@pids) {
print "Jumlah pid milik user *$ARGV[0]* = $ada \n\n";
} else {
die ("tidak ada user *$ARGV[0]* yang berproses,\nsilahkan cek kembali...\n\n");
}
print "Daftar PID yang akan di kill :\n";
foreach $p1d(@pids) {
print "$p1d ";
}
print "\n\nSiap-siap ngekill user *$ARGV[0]* :\n\n";
sleep 2;
foreach $p1d(@pids) {
$status_hidup=(kill(0,$p1d));
#print $status_hidup;
if ($status_hidup) {
print "Coba bunuh PID $p1d ... ";
$status_mati=kill(9,$p1d);
if ($status_mati) {
print "done...\n";
} else {
print "Gagal membunuh PID $p1d\n";
}
} elsif ($!{EPERM}) {
print "Anda memiliki masalah dengan permission! Gagal membunuh PID $p1d\n";
} else {
print "Sudah tak ada proses dengan PID $p1d\n";
}
sleep 1;
}
print "Selesai....\n\n";
************akhir ngekill.pl*********************
Akhir kata, seperti kata nenek moyang kita, bahwa “TAK ADA GADING YANG TAK RETAK”,
maka penulis memohon maaf bila ada ketidaksempurnaan. Penulis berharap akan ada banyak
masukan dari para senior di se-antero Indonesia. Thx.
Catatan : file-file dan gambar yang berhubungan dengan utility kecil ini,
dapat anda temukan di www.geocities.com/iko94/ngekill.
REFERENCES :
1.Perl Programmers Reference Guide (perl manual)
2.perlipc - Perl Interprocess Communication documentation
3.Dasar Pemrograman Perl (Abdul Kadir)
THX TO :
1.G O D
2.My Lovely WIFE
3.GNU Team, Mandrake, Linus Torvalds & Larry Wall
4.qq & tiyox
5.1st team (boeboe yg jomblo & alphret)
6.neoteker team (kendi, zacka, geo)
MEREK DAGANG :
Seluruh merek dagang yang digunakan dalam artikel ini merupakan hak cipta dari pemegang
merek dagang masing-masing. Linux merupakan trade mark dari Linus Torvalds. Linux di sini
adalah singkatan dari GNU/Linux.
KONTAK :
1.iko_riyadi@yahoo.com
2.www.geocities.com/iko94/ngekill
3.www.neoteker.or.id
               (
geocities.com/iko94)