Membuat Application Control Script
Background
Sekitar seminggu yang lalu saya ditugaskan untuk membuat sebuah skrip yang digunakan untuk mengontrol service di Linux. Skrip tersebut harus bisa menjalankan proses server apabila servernya belum dijalankan, mampu memberhentikan service tersebut dan juga merestart server, baik dari keadaan sudah dijalankan atau belum. Server executablenya disini merupakan aplikasi java dalam bentuk java archive.
Work Flow
Apabila user menjalankan skrip tersebut, skripnya akan mengecek apakah user memberikan parameter yang dibutuhkan, yaitu start, restart atau stop. Apabila user memasukkan parameter yang tidak dikenali, skrip akan menampilkan pesan yang memberitahukan bahwa parameter tidak dikenal. Apabila user memberikan parameter start skrip akan memeriksa apakah file server.pid yang berisi pid dari aplikasi tersebut ada atau tidak. Apabila ada skrip akan menampilkan pesan bahwa aplikasi tersebut sudah jalan dengan pid yang dambil dari file server.pid. Apabila belum skrip akan menjalankan aplikasi tersebut dan menyimpan pid dari process itu ke file server.pid. Bila parameter yang diberikan parameter stop maka skrip akan memeriksa apakah aplikasinya memang berjalan dengan mengecek file server.pid. Apabila ada skrip akan memberhentikan process tersebut dengan bantuan pid yang diambil dari file server.pid, dan setelah process-nya berhenti file server.pid tersebut akan dihapus. Apabila file server.pid tidak ditemukan maka skrip akan menampilkan pesan bahwa aplikasi yang dimaksud tidak berjalan. Parameter restart akan menjalankan fungsi stop terlebih dahulu dilanjutkan dengan fungsi start.
Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #!/bin/sh #License GPL Version 2 #script to start, stop and restart server application #check if user enter the parameter if [ -z "$1" ] then echo "Usage: `basename $0` {start | restart | stop}" exit fi #variable that hold java binary export JAVABIN=`/app/java/jdk1.6.0_03/bin/java` #variable that hold base directory export BASEDIR=$HOME/server #variable that hold jar file or server application location export JARFILE=$BASEDIR/server.jar #variable that hold date time format for renaming log file export DTM=`date +%Y%m%d-%H%M%S` #variable that hold log file location export LOG=$BASEDIR/server.log #variable that hold file containing server pid export PIDFILE=$BASEDIR/server.pid function startServer(){ if [ -f "$PIDFILE" ] then echo "server already running with pid:`cat $PIDFILE`" else $JAVABIN -jar $JARFILE & PID=$! echo $PID > $PIDFILE echo "server started with pid:$PID" fi } function stopServer(){ #check if server already running if [ -f "$PIDFILE" ] then export PID=`cat $PIDFILE` echo "server running with pid:$PID" kill -9 $PID rm $PIDFILE mv $LOG $LOG-$DTM echo "server stopped" else echo "server are not running" fi } cd $BASEDIR if [ "$1" == "start" ] then echo "server start command issued..." #put the code to start the server here startServer exit elif [ "$1" == "stop" ] then echo "server stop command issued..." #put the code to stop the server here stopServer exit elif [ "$1" == "restart" ] then echo "server restart command issued..." #put the code to restart the server here stopServer startServer exit else echo "unknown command `basename $1`, supported command are: start, restart, stop" exit fi |
Simpan file ini sebagai server.sh. Beri permission execute dengan:
chmod +x server.shJalankan skrip ini dengan perintah:
./server.shExplanation
Baris yang pertama berupa:
#!/bin/shmerupakan opsional. Saya lupa lagi apa istilahnya, intrepeter directive atau apa. Baris ini memberitahukan kepada Linux intrepreter apa yang digunakan untuk mengeksekusi skrip tersebut, dalam hal ini kita meminta agar skrip ini dieksekusi menggunakan shell default yang memiliki path /bin/sh. Di sistem operasi openSUSE /bin/sh merupakan symlink untuk Shell Bash /bin/bash. Apabila kita tidak menggunakan baris ini user harus menjalankan shell dengan skrip ini sebagai parameter seperti dibawah ini:
sh server.shBaris berikutnya:
#License GPL Version 2 #script to start, stop and restart server application
merupakan baris komentar. Baris yang diawali dengan # akan diabaikan oleh shell.
Potongan kode berikutnya:
#check if user enter the parameter if [ -z "$1" ] then echo "Usage: `basename $0` start | restart | stop" exit fi
untuk melakukan pengecekan apakah user mengeksekusi skrip beserta parameter yang dibutuhkan.
if [ -z "$1" ]
Operator -z digunakan untuk mengecek apakah stringnya null atau tidak. $1 merupakan built-in variable yang dapat kita gunakan untuk mengakses parameter pertama yang dijalankan bersama dengan skrip. Untuk mengakses parameter kedua dan seterusnya ganti nilai 1 dengan 2 dan seterusnya sampai 9. Apabila kosong, yang berarti user tidak memasukkan parameter yang kita harapkan, baris ini menghasilkan nilai true yang berarti akan menjalankan kode berikutnya:
echo "Usage: `basename $0` {start | restart | stop}" exit
echo digunakan untuk mencetak ke alat output standar, dalam hal ini layar monitor. exit akan menyebabkan skrip untuk keluar.
#variable that hold java binary export JAVABIN=`/app/java/jdk1.6.0_03/bin/java` #variable that hold base directory export BASEDIR=$HOME/server #variable that hold jar file location export JARFILE=$BASEDIR/server.jar #variable that hold date time format for renaming log file export DTM=`date +%Y%m%d-%H%M%S` #variable that hold log file location export LOG=$BASEDIR/server.log #variable that hold file containing application pid export PIDFILE=$BASEDIR/server.pid
Potongan kode diatas melakukan insialisasi variabel-variabel yang akan kita gunakan dalam skrip ini. export digunakan untuk menset variabel shell. Pastikan tidak ada spasi antara nama variabel, = dan isi variabelnya. Untuk mengakses variabel tambahkan $ dollar sign didepan nama variabel yang dimaksud.
Perhatikan baris kode ini:
export BASEDIR=$HOME/server
Variable $HOME belum pernah diinisialisasi, lalu bagaimana bisa ada nilainya? Shell Bash memiliki beberapa variabel global yang dapat digunakan oleh process shell-shell yang dijalankan dibawahnya. Dalam hal ini $HOME berisi path home untuk user. Untuk melihat variabel-variabel apa saja yang tersedia, jalankan perintah env di command line. Pastikan variabel yang dinisialisasi belum digunakan untuk menghindari terjadinya konflik variabel.
function startServer(){ if [ -f "$PIDFILE" ] then echo "server already running with pid:`cat $PIDFILE`" else $JAVABIN -jar $JARFILE & PID=$! echo $PID > $PIDFILE echo "server started with pid:$PID" fi }
Potongan kode diatas merupakan fungsi yang digunakan untuk menjalankan server.
function startServer(){
Merupakan syntax untuk membuat fungsi. Syntax ini cukup jelas penggunaannya.
if [ -f "$PIDFILE" ] then echo "server already running with pid:`cat $PIDFILE`"
Operator -f digunakan untuk mengecek apakah file yang dimaksud ada yang akan mengembalikan nilai true dan mencetak process id (PID) dari aplikasi server tersebut.
else $JAVABIN -jar $JARFILE &
Jika file server.pid tidak ada maka aplikasi servernya akan dijalankan, dalam hal ini berarti aplikasi java. Parameter & digunakan untuk mengirim process aplikasi tersebut ke background. Kenapa dikirim ke background? Agar pid aplikasi tersebut dapat diambil menggunakan kode berikut:
PID=$!
Variabel $! digunakan untuk mengambil pid dari background process terakhir, dalam hal ini aplikasi server yang kita jalankan sebelumnya.
echo $PID > $PIDFILE echo "server started with pid:$PID" fi }
Setelah itu nilai pid tersebut disimpan ke dalam file, dan skrip akan menampilkan pesan bahwa server sudah dijalankan dengan pid yang didapatkan sebelumnya.
function stopServer(){ #check if server already running if [ -f "$PIDFILE" ] then
Seperti sebelumnya, skrip akan mengecek apakah servernya berjalan atau tidak dengan melihat apakah file server.pid ada atau tidak, apabila ada
export PID=`cat $PIDFILE` echo "server running with pid:$PID"
nilai pid-nya akan disimpan ke variable $PID
kill -9 $PID
kemudian process tersebut diberhentikan secara paksa menggunakan perintah kill
rm $PIDFILE mv $LOG $LOG-$DTM echo "server stopped"
file server.pid kemudian dihapus dan file log yang dihasilkan aplikasi server tersebut di rubah namanya ditambahkan dengan informasi waktu saat perintah ini dijalankan.
else echo "server are not running" fi }
Jika tidak ada skrip akan menampilkan pesan bahwa process yang dimaksud tidak ada.
cd $BASEDIR
Agar semua proses eksekusi dijalankan dari direktori utama, kita pindah ke direktori yang ditentukan sebagai direktori utama dari skrip server ini.
if [ "$1" == "start" ] then
Kemudian dicek apabila parameter start yang diberikan maka
echo "server start command issued..." #put the code to start the server here startServer exit
skrip akan memanggil fungsi startServer. Cara menjalankan fungsi di bash cukup dengan memanggil nama fungsinya seperti diatas.
Jika yang berikan adalah parameter stop
elif [ "$1" == "stop" ] then echo "server stop command issued..." #put the code to stop the server here stopServer exit
maka panggil fungsi stopServer.
Jika parameter yang dipanggil restart
elif [ "$1" == "restart" ] then echo "server restart command issued..." #put the code to restart the server here stopServer startServer exit
Jalankan fungsi stopServer terlebih dahulu dilanjutkan dengan startServer. Fungsi restart disini tidak akan memeriksa apakah aplikasinya sedang berjalan atau tidak, karena memang tidak ada bedanya.
Jika user memberikan parameter diluar yang sudah kita tentukan diatas
else echo "unknown command `basename $1`, supported command are: start, restart, stop" exit fi
maka skrip akan menampilkan pesan bahwa paramater yang dimaksud tidak dikenal.
Summary
Flow dalam scripting language seperti bash cukup mudah untuk dipahami, seperti dalam contoh diatas, skripnya menjalankan baris-baris kodenya satu-persatu mulai dari inisialisasi variabel, pembuatan fungsi sampai flow utamanya yaitu dengan mengecek paramater mana yang dimasukkan user dan menjalankan perintah sesuai dengan parameter yang dimasukkan.
Koreksi, saran dan pertanyaan silakan gunakan fasilitas komentar di bawah ini.
Semoga bermanfaat and have a lot of fun!




