Saturday, July 28, 2007

Otomatisasi dengan skrip shell (bagian 2)

Priyadi Iman Nurcahyo
Majalah InfoKomputer
Juli 2000

Dalam edisi yang lalu, kita telah membahas beberapa konstruksi dari Bourne Again Shell. Kini kita akan membahas beberapa konstruksi lainnya, serta bagaimana mengotomatisasi eksekusi skrip shell melalui cron dan at.
Konstruksi untuk Looping
Bash memiliki dua buah konstruksi untuk melakukan iterasi, yaitu while dan until. Keduanya memiliki sintaks seperti di bawah ini:
while kondisi ; do perintah ; done
until kondisi ; do perintah ; done
Pada konstruksi while, bash akan mengeksekusi perintah berulang-ulang jika kondisi bernilai benar. Sedangkan pada konstruksi until, bash akan mengeksekusi perintah berulang-ulang jika kondisi bernilai salah.
Sebagaimana konstruksi lainnya, anda dapat menggabungkan beberapa perintah dalam satu baris dengan menggunakan titik koma (;). Anda juga dapat mengeksekusi perintah di dalam sub-shell dengan menuliskannya di dalam tanda kurung. Kondisi dapat berupa perintah shell biasa ataupun test kondisi (lihat di bawah). Anda juga dapat menempatkan beberapa perintah di dalam kondisi, namun anda harus memasukkannya di dalam tanda kurung (dieksekusi di dalam sub shell), perintah yang akan dicek kebenarannya adalah perintah yang terakhir.
Contoh:
• (while true ; do (clear ; who ; sleep 5) ; done), memonitor user yang sedang online, perintah tersebut akan menghapus layar, kemudian menampilkan output perintah who berulang-ulang setiap lima detik. Perintah true akan selalu bernilai benar. Seluruh konstruksi while dijalankan di dalam sub-shell supaya dapat di-break dengan menggunakan Ctrl-C, jika tidak, Ctrl-C hanya akan berpengaruh pada perintah (clear ; who ; sleep 5).
Konstruksi untuk Kondisi
Kondisi adalah konstruksi yang wajib dimiliki oleh bahasa pemrograman dan skrip apapun. Bash memiliki konstruksi seperti dalam bentuk if ... then ... else ... fi. Konstruksi tersebut memiliki sintaks seperti ini:
if kondisi
then
perintah1
else
perintah2
fi
Bash akan mengeksekusi perintah1 jika kondisi terpenuhi, atau bash akan mengeksekusi perintah2 jika kondisi tidak terpenuhi. Seperti biasa, kondisi dapat terdiri dari beberapa perintah shell jika dilingkungi oleh tanda kurung. Perintah1 dan perintah2 dapat juga terdiri dari beberapa baris perintah.
Beberapa buah contoh:
• if ping -c1 sinta ; then logger "sinta hidup" ; else logger "sinta meninggal" ; fi, ping -c1 delta akan mencek apakah komputer bernama sinta sedang aktif. Jika sedang aktif, pesan "sinta hidup" akan dikirim ke syslog, dan jika sedang mati, pesan "sinta meninggal" akan dikirim ke syslog. Di kebanyakan distribusi Linux, biasanya pesan tersebut akan ditemukan di file /var/log/messages atau /var/adm/messages
• for A in `find / -type f`
• do
• if (file $A | grep text > /dev/null)
• then
• sed s/10\.0\.0\.1/192.168.0.1/g < $A > $A._tmp
• mv -f $A._tmp $A
• fi
• done
• Perintah ini akan mengganti seluruh string 10.0.0.1 menjadi 192.168.0.1 pada setiap file teks yang ada di dalam filesystem. Perintah file $A | grep text akan bernilai benar jika file pada variabel $A adalah file teks.
• while true
• do
• sleep 5
• if (ifconfig | grep ppp0 > /dev/null)
• then
• if ( ! ps -x | grep -v grep | grep gnomeicu > /dev/null)
• then
• gnomeicu -a &
• fi
• if ( ! ps -x | grep -v grep | grep gaim > /dev/null)
• then
• gaim &
• fi
• else
• killall gnomeicu 2> /dev/null
• killall gaim 2> /dev/null
• fi
• done
• Perintah di atas akan mencek kondisi link internet dial-up setiap 5 detik. Perintah ifconfig | grep ppp0 mencek apakah string ppp0 ada pada output dari ifconfig, dengan kata lain mencek apakah link internet dial-up sedang aktif. Jika sedang aktif maka bash akan menjalankan gnomeicu dan gaim di background (dengan menggunakan tanda &), dan jika sedang tidak aktif, bash akan mematikan kedua proses tersebut. Tanda \ pada skrip di atas berguna untuk memisahkan baris yang terlalu panjang ke baris lainnya, namun tetap dianggap sebagai satu baris perintah oleh bash. Perintah ps -x | grep -v grep | grep gnomeicu akan memberikan nilai benar jika ditemukan proses gnomeicu yang sedang aktif, grep -v grep dalam hal ini diperlukan untuk memfilter string grep, karena string grep gnomeicu akan muncul pada tabel proses. Tanda 2> /dev/null akan mengakibatkan pesan error tidak ditampilkan (killall akan menampilkan pesan error jika proses yang akan dimatikan ternyata tidak aktif. Namun skrip shell tersebut akan lebih efisien jika dilakukan dari dalam cron (lihat di bawah).
Menjalankan Perintah Secara Berkala dengan Cron
Cron berguna untuk menjalankan perintah-perintah setiap waktu tertentu. Sebelum menggunakan cron, pastikanlah daemon crond sedang berjalan dengan menggunakan ps auwx | grep crond. Jika belum aktif, aktifkanlah dengan menggunakan skrip inisialisasi crond, biasanya ditemukan di /etc/rc.d/init.d pada distribusi RedHat atau kompatibel, atau /etc/init.d pada distribusi Debian. Untuk mengaktifkannya pada setiap booting gunakan ntsysv jika anda menggunakan RedHat atau kompatibel.
Konfigurasi cron dilakukan dengan menggunakan perintah crontab -e. Sebelum menjalankan crontab, ada baiknya anda menset variabel EDITOR berisi editor teks favorit anda, misalnya: export EDITOR=pico, jika anda menggunakan pico.
Format crontab terdiri dari beberapa baris, dengan satu baris berisi satu perintah berkala. Setiap baris terdiri dari lima buah field pertama yang berisi informasi kapan perintah tersebut akan dijalankan. Field-field tersebut adalah:
• menit, bernilai 0-59
• jam, bernilai 0-23
• tanggal, bernilai 0-31
• bulan, bernilai 0-12
• hari, bernilai 0-7 (0 atau 7 adalah hari Minggu)
Selain dari field-field tersebut, adalah perintah yang akan dieksekusi oleh cron. Nilai dapet berupa range (dipisahkan oleh -) atau beberapa nilai (dipisahkan oleh koma (,)). Anda dapat juga menggunakan asterisk untuk mencantumkan semua nilai yang mungkin untuk field tersebut.
Contoh:
• 5 0 * * * cat /dev/null > /var/log/pacct
mengosongkan file /var/log/pacct (untuk keperluan process accounting) setiap jam 12 malam lewat 5 menit
• 5 3 1,15 * * df | mail admin
melaporkan keadaan ruang harddisk kepada admin melalui email setiap tanggal 1 dan 15 setiap bulannya, pada pukul 3.15 pagi
• * * * * * (if (ifconfig | grep ppp0) ; then /usr/local/bin/ppp-nyala ; else /usr/local/bin/ppp-mati ; fi ) > /dev/null 2>&1
(semua dalam satu baris)
akan menjalankan skrip /usr/local/bin/ppp-mati jika koneksi internet dalam keadaan hidup, dan menjalankan /usr/local/bin/ppp-mati jika koneksi dial-up internet dalam keadaan mati, pengecekan dilakukan setiap menit.
• 0 0-23/2 * * 1-5 (if ping -c1 donna ; then logger "donna sehat wal afiat" ; else logger "donna meninggal" ; fi)
(semua dalam satu baris)
mencek keadaan donna (komputer bernama donna) apakah hidup atau mati (dengan cara ping), pengecekan dilakukan setiap dua jam pada hari kerja (Senin-Jumat), pesan akan disampaikan melalui syslog.
• 0 3 * * * (cd /home/priyadi/htdocs/lt ; wget http://www.linuxtoday.com)
(semua dalam satu baris)
mendownload halaman muka dari LinuxToday ke dalam direktori /home/priyadi/htdocs/lt setiap jam 3 pagi.
Menjalankan Perintah di Masa Yang Akan Datang
Jika cron menjalankan sebuah perintah secara rutin, maka at menjalankan perintah hanya satu kali. Perintah yang sering digunakan untuk menjalankan at adalah sebagai berikut:
echo "perintah" | at waktu
at akan membaca perintah dari standard input, dan menjalankannya pada waktu yang telah ditentukan. Seperti halnya crond, untuk menjalankan at, anda harus mengaktifkan daemon atd. Cara pengaktifannya mirip dengan cara mengaktifkan crond di atas. Perintah yang dijalankan melalui at akan memiliki lingkungan yang serupa dengan lingkungan pada saat anda menjalankan at.
at juga memiliki beberapa program pembantu:
• atq, untuk melihat perintah-perintah yang akan dikerjakan oleh at
• atrm, untuk menghapus perintah-perintah tersebut, gunakan nomor perintah seperti yang tercantum di perintah atq
Beberapa contoh penggunaan at:
• echo "wget -t0 -c ftp://updates.redhat.com/6.0/i386/*" | at 0200
mendownload update dari RedHat Linux 6.0 pada jam 2 malam
• echo "cat /boot/vmlinuz > /dev/dsp" | at 0500
membangunkan anda pada jam 5 pagi. cat /boot/vmlinuz > /dev/dsp akan mengirimkan kernel Linux langsung ke kartu suara anda, tentunya anda juga dapat menggantikan kernel Linux dengan file suara yang lebih enak didengar :-)
• echo "killall pppd" | at now+15minutes
akan memutuskan hubungan Internet anda 15 menit kemudian.
• echo "halt" | at now+2hours
akan mematikan komputer anda dua jam kemudian (tentunya jika komputer anda memiliki fasilitas ATX)
Memilih Jalan untuk Menyelesaikan Pekerjaan Anda
Walaupun Linux memiliki antarmuka grafis yang menarik, namun belum tentu antarmuka grafis akan menyelesaikan pekerjaan lebih cepat dan efisien dibandingkan antarmuka teks. Dengan antarmuka grafis, sebuah pekerjaan akan lebih mudah dipelajari, dan akan lebih mudah dikerjakan, jika fasilitas untuk menyelesaikan pekerjaan anda tersedia. Namun jika tidak tersedia, anda tidak memiliki pilihan apa-apa. Antarmuka teks lebih sulit dipelajari dibandingkan dengan antarmuka grafis, namun memiliki kelebihan dalam hal otomatisasi, anda dapat menyingkat pekerjaan-pekerjaan yang berulang-ulang, dan menginstruksikan komputer untuk mengerjakan pekerjaan-pekerjaan tersebut. Hal ini tentunya akan menghemat sumber daya, dan memaksimalkan pekerjaan komputer, sehingga dapat menekan biaya operasional. Sebuah server bahkan hampir tidak perlu mendapat perhatian manusia jika segalanya telah diotomatisasi.
Linux mendukung kedua antarmuka tersebut, grafis dan teks, sehingga anda dapat memanfaatkan antarmuka yang lebih menguntungkan untuk menyelesaikan pekerjaan-pekerjaan anda. Anda dapat menggunakan komputer dengan salah satu dari antarmuka tersebut, namun anda dapat menggunakan komputer dengan lebih efisien dan efektif jika anda menggunakan keduanya.
Mungkin hal yang lebih sulit adalah mengidentifikasi pekerjaan-pekerjaan yang dapat diotomatisasi dalam antarmuka teks karena hampir semua dari kita telah terbiasa oleh antarmuka grafis. Mengotomatisasi pekerjaan adalah hal membutuhkan sumber daya (waktu) yang tidak sedikit, namun otomatisasi akan menghemat waktu anda dalam jangka panjang. Hal yang harus anda lakukan adalah mencari pekerjaan-pekerjaan yang dilakukan secara berulang kali, serta tidak membutuhkan pemikiran manusia. Pekerjaan-pekerjaan seperti membackup file, mendownload email, serta menghapus file log adalah kandidat kuat untuk diotomatisasi karena tidak membutuhkan pemikiran manusia. Sedangkan pekerjaan-pekerjaan seperti membuat surat atau laporan serta membuat program adalah hal-hal yang membutuhkan pemikiran serta perasaan manusia, dan tidak dapat dilakukan sepenuhnya oleh komputer.
Yang diperlukan untuk melakukan otomatisasi hanyalah kreativitas, karena di dalam kebanyakan distribusi Linux, semua program untuk keperluan tersebut telah disediakan.