Neuronworks Blog, WebMethods, Oracle, Bea, Java Dev2Dev, Arch2Arch Neuronworks Make IT Easy, Let's Play the Game » 2008 » December

Archive

Archive for December, 2008

Backup dan Restore Schema Oracle Menggunakan exp dan imp

December 31st, 2008

Oracle menyediakan perintah untuk membackup schema dan merestore schema hasil backup tersebut. Kedua perintah tersebut yaitu exp untuk membackup schema dan imp untuk merestore schema hasil backup sebelumnya.
Kita coba dengan backup terlebih dahulu. Pertama kita buat direktori backup untuk menampung hasil backup schema yang kita lakukan, kemudian kita gunakan direktori tersebut sebagai base direktori pekerjaan kita:

oracle@NeuronServer:~> mkdir schema-backup
oracle@NeuronServer:~> cd schema-backup/
oracle@NeuronServer:~/schema-backup>

Misalnya kita ingin membackup schema train yang memiliki password train yang ada di server oracle dengan service id neuron, file backup schema-nya kita simpan dengan nama train.dmp. Penggunaan perintah exp-nya seperti dibawah ini:

oracle@NeuronServer:~/schema-backup> exp train/train@neuron file=train.dmp    
 
Export: Release 10.2.0.1.0 - Production on Fri Jan 2 16:17:32 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user TRAIN
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user TRAIN
About to export TRAIN's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export TRAIN's tables via Conventional Path ...
. . exporting table                          TRAIN          2 rows exported
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully without warnings.
oracle@NeuronServer:~/schema-backup>

File train.dmp tersebut dapat kita gunakan untuk merestore schema tersebut dikemudian hari atau untuk menduplikat schema tersebut ke server yang lain.
Sebagai contoh kita gunakan file tersebut untuk menduplikat schema di mesin yang berbeda tapi memiliki user yang sama yaitu train. Penggunaan imp:

oracle@linuxbox:~> imp train/train@xe file=/home/alam/train.dmp
 
Import: Release 10.2.0.1.0 - Production on Fri Jan 2 15:43:10 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 
Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
 
Export file created by EXPORT:V10.02.01 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing TRAIN's objects into TRAIN
. . importing table                        "TRAIN"          2 rows imported
Import terminated successfully without warnings.
oracle@linuxbox:~>

Pastikan bahwa schema yang dimaksud (train) ada di server yang hendak direstore. Perlu diingat bahwa perintah imp ini akan menimpa schema yang sudah ada di server, jadi pastikan bahwa anda memang ingin menimpa schema tersebut.

UPDATE

Ada banyak opsi-opsi yang dapat kita gunakan dalam menggunakan exp dan imp. Untuk mengetahui apa saja opsi-opsi yang tersedia jalankan perintah berikut:

oracle@NeuronServer:~> exp help=y
 
Export: Release 10.2.0.1.0 - Production on Fri Jan 2 14:06:04 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 
 
You can let Export prompt you for parameters by entering the EXP
command followed by your username/password:                     
 
     Example: EXP SCOTT/TIGER
 
Or, you can control how Export runs by entering the EXP command followed
by various arguments. To specify parameters, you use keywords:          
 
     Format:  EXP KEYWORD=value or KEYWORD=(value1,value2,...,valueN)
     Example: EXP SCOTT/TIGER GRANTS=Y TABLES=(EMP,DEPT,MGR)         
               or TABLES=(T1:P1,T1:P2), if T1 is partitioned table   
 
USERID must be the first parameter on the command line.
 
Keyword    Description (Default)      Keyword      Description (Default)
--------------------------------------------------------------------------
USERID     username/password          FULL         export entire file (N)
BUFFER     size of data buffer        OWNER        list of owner usernames
FILE       output files (EXPDAT.DMP)  TABLES       list of table names
COMPRESS   import into one extent (Y) RECORDLENGTH length of IO record
GRANTS     export grants (Y)          INCTYPE      incremental export type
INDEXES    export indexes (Y)         RECORD       track incr. export (Y)
DIRECT     direct path (N)            TRIGGERS     export triggers (Y)
LOG        log file of screen output  STATISTICS   analyze objects (ESTIMATE)
ROWS       export data rows (Y)       PARFILE      parameter filename
CONSISTENT cross-table consistency(N) CONSTRAINTS  export constraints (Y)
 
OBJECT_CONSISTENT    transaction set to read only during object export (N)
FEEDBACK             display progress every x rows (0)
FILESIZE             maximum size of each dump file
FLASHBACK_SCN        SCN used to set session snapshot back to
FLASHBACK_TIME       time used to get the SCN closest to the specified time
QUERY                select clause used to export a subset of a table
RESUMABLE            suspend when a space related error is encountered(N)
RESUMABLE_NAME       text string used to identify resumable statement
RESUMABLE_TIMEOUT    wait time for RESUMABLE
TTS_FULL_CHECK       perform full or partial dependency check for TTS
VOLSIZE              number of bytes to write to each tape volume
TABLESPACES          list of tablespaces to export
TRANSPORT_TABLESPACE export transportable tablespace metadata (N)
TEMPLATE             template name which invokes iAS mode export
 
Export terminated successfully without warnings.
oracle@NeuronServer:~> imp help=y               
 
Import: Release 10.2.0.1.0 - Production on Fri Jan 2 14:08:51 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 
 
You can let Import prompt you for parameters by entering the IMP
command followed by your username/password:                     
 
     Example: IMP SCOTT/TIGER
 
Or, you can control how Import runs by entering the IMP command followed
by various arguments. To specify parameters, you use keywords:          
 
     Format:  IMP KEYWORD=value or KEYWORD=(value1,value2,...,valueN)
     Example: IMP SCOTT/TIGER IGNORE=Y TABLES=(EMP,DEPT) FULL=N      
               or TABLES=(T1:P1,T1:P2), if T1 is partitioned table   
 
USERID must be the first parameter on the command line.
 
Keyword  Description (Default)       Keyword      Description (Default)
--------------------------------------------------------------------------
USERID   username/password           FULL         import entire file (N)
BUFFER   size of data buffer         FROMUSER     list of owner usernames
FILE     input files (EXPDAT.DMP)    TOUSER       list of usernames
SHOW     just list file contents (N) TABLES       list of table names
IGNORE   ignore create errors (N)    RECORDLENGTH length of IO record
GRANTS   import grants (Y)           INCTYPE      incremental import type
INDEXES  import indexes (Y)          COMMIT       commit array insert (N)
ROWS     import data rows (Y)        PARFILE      parameter filename
LOG      log file of screen output   CONSTRAINTS  import constraints (Y)
DESTROY                overwrite tablespace data file (N)
INDEXFILE              write table/index info to specified file
SKIP_UNUSABLE_INDEXES  skip maintenance of unusable indexes (N)
FEEDBACK               display progress every x rows(0)
TOID_NOVALIDATE        skip validation of specified type ids
FILESIZE               maximum size of each dump file
STATISTICS             import precomputed statistics (always)
RESUMABLE              suspend when a space related error is encountered(N)
RESUMABLE_NAME         text string used to identify resumable statement
RESUMABLE_TIMEOUT      wait time for RESUMABLE
COMPILE                compile procedures, packages, and functions (Y)
STREAMS_CONFIGURATION  import streams general metadata (Y)
STREAMS_INSTANTIATION  import streams instantiation metadata (N)
VOLSIZE                number of bytes in file on each volume of a file on tape
 
The following keywords only apply to transportable tablespaces
TRANSPORT_TABLESPACE import transportable tablespace metadata (N)
TABLESPACES tablespaces to be transported into database
DATAFILES datafiles to be transported into database
TTS_OWNERS users that own data in the transportable tablespace set
 
Import terminated successfully without warnings.
oracle@NeuronServer:~>

Sebelumnya kita mengekspor schema yang memiliki dua user yang sama di dua sistem yang berbeda. Bagaimana jika database yang akan mengimpor menggunakan username yang berbeda? Sebagai contoh saya akan mencoba mengimpor schema train yang sebelumnya dibackup untuk direstore di server yang ada di mesin yang berbeda, dimana user yang digunakan yaitu neurondev dengan password neurondev yang ada di service xe. Logisnya saya akan menggunakan command dibawah ini:

oracle@linuxbox:~> imp neurondev/neurondev@xe file=/home/alam/train.dmp
 
Import: Release 10.2.0.1.0 - Production on Fri Jan 2 13:48:33 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 
Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
 
Export file created by EXPORT:V10.02.01 via conventional path
 
Warning: the objects were exported by TRAIN, not by you
 
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing TRAIN's objects into NEURONDEV
Import terminated successfully without warnings.
oracle@linuxbox:~>

Kita tidak bisa mengimpor schema yang dibuat oleh user yang lain yang berbeda dengan yang kita gunakan untuk mengimpor schema tersebut, dalam hal ini backup schema tersebut dimiliki oleh user train sedangkan kita menggunakan user neurondev. Bagaimana solusinya? Gunakan opsi fromuser dan touser yang disediakan oleh imp seperti ini:

oracle@linuxbox:~> imp neurondev/neurondev@xe file=/home/alam/train.dmp fromuser=train touser=neurondev
 
Import: Release 10.2.0.1.0 - Production on Fri Jan 2 14:57:59 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 
Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
 
Export file created by EXPORT:V10.02.01 via conventional path
 
Warning: the objects were exported by TRAIN, not by you
 
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. . importing table                        "TRAIN"          2 rows imported
Import terminated successfully without warnings.
oracle@linuxbox:~>

Opsi fromuser digunakan untuk memberitahu oracle user awal yang memiliki backup schema tersebut (owner) dan opsi touser digunakan untuk menentukan user mana yang akan memiliki schema hasil impor tersebut. Jadi kita isi train untuk opsi fromuser karena backup schema tersebut dimiliki oleh user train dan dibackupnya pun oleh user train. Sedangkan opsi fromuser kita isi dengan neurondev karena user ini yang akan memiliki schema hasil impor tersebut dan juga user yang melakukan proses impornya.
Sekarang mari kita coba mengimpornya menggunakan user yang sama sekali berbeda:

oracle@linuxbox:~> imp admin/admin@xe file=/home/alam/train.dmp fromuser=train touser=neurondev
 
Import: Release 10.2.0.1.0 - Production on Fri Jan 2 15:23:23 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
 
Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
 
Export file created by EXPORT:V10.02.01 via conventional path
 
Warning: the objects were exported by TRAIN, not by you
 
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
IMP-00007: must be a DBA to import objects to another user's account   
IMP-00000: Import terminated unsuccessfully                            
oracle@linuxbox:~>

Kita membutuhkan user dengan grant DBA jika ingin melakukan hal diatas.

oracle@linuxbox:~> imp system@xe file=/home/alam/train.dmp fromuser=train touser=neurondev
 
Import: Release 10.2.0.1.0 - Production on Fri Jan 2 15:24:55 2009
 
Copyright (c) 1982, 2005, Oracle.  All rights reserved.
 
Password:
 
Connected to: Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
 
Export file created by EXPORT:V10.02.01 via conventional path
 
Warning: the objects were exported by TRAIN, not by you
 
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses AL32UTF8 character set (possible charset conversion)
. importing TRAIN's objects into NEURONDEV
. . importing table                        "TRAIN"          2 rows imported
Import terminated successfully without warnings.
oracle@linuxbox:~>

Semoga bermanfaat and have a lot of fun!

Oracle , ,

Me-Resize ukuran Temporary Tablespace

December 29th, 2008

Suatu ketika saya kaget melihat ukuran temporary tablespace saya yang mencapai 2 GB, kenapa bisa sebesar ini, ternyata setelah di lihat memang di konfigurasinya autoextends, ya sudah akhirnya saya mencoba untuk meresize ukuran tersebut.

berikut kronologi melakukan resize temp tablesapce :

langkah pertama yang saya lakukan adalah :

SQL> ALTER DATABASE tempfile '/app/oradata/NEURON/temp01.dbf' resize 250M;
ALTER DATABASE tempfile '/app/oradata/NEURON/temp01.dbf' resize 250M
*
ERROR AT line 1:
ORA-03297: FILE contains used data beyond requested RESIZE VALUE

ooo , ternyata error berarti tidak bisa menggunakan cara ini, cara berikutnya adalah Drop dan Create ulang tablesapce temp

berikut langkah-langkahnya :

SQL> DROP TABLESPACE temp;
 
TABLESPACE dropped.

Create ulang temp tablespace

SQL> CREATE TEMPORARY TABLESPACE TEMP
  2  TEMPFILE '/app/oradata/NEURON/temp01.dbf' SIZE 500M REUSE
  3  AUTOEXTEND ON NEXT 100M MAXSIZE unlimited
  4  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
 
TABLESPACE created.

perintah diatas akan berhasil jika, oracle yang kita gunakan adalah oracle 8i atau oracle 9i dengan temp tablespace bukan default temporary tablesapace.

SQL> DROP TABLESPACE temp;
DROP TABLESPACE temp
*
ERROR AT line 1:
ORA-12906: cannot DROP DEFAULT TEMPORARY TABLESPACE

jika kita ingin merubah ukuran temp tablespace yang menjadi default temp tablespace kita harus meggunakan menggunakan cara berikut :

misalkan tablespace yang akan dirubah adalah temp dan merupakan default tablesapce, langkah pertama kita harus membuat tablespace baru misal temp2, kemudian merubah default tablespace dari temp menjadi temp2, kita rubah kembali default tablespace ke temp dan hapus temp2

SQL> CREATE TEMPORARY TABLESPACE temp2
  2  TEMPFILE '/app/oradata/NEURON/temp2_01.dbf' SIZE 5M REUSE
  3  AUTOEXTEND ON NEXT 1M MAXSIZE unlimited
  4  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
 
TABLESPACE created.
 
 
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
 
DATABASE altered.
 
 
SQL> DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;
 
TABLESPACE dropped.
 
SQL> CREATE TEMPORARY TABLESPACE temp
  2  TEMPFILE '/app/oradata/NEURON/temp01.dbf' SIZE 500M REUSE
  3  AUTOEXTEND ON NEXT 100M MAXSIZE unlimited
  4  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
 
TABLESPACE created.
 
 
SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
 
DATABASE altered.
 
 
SQL> DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES;
 
TABLESPACE dropped.

untuk oracle 9i ke atas perubahan ukuran tablespace akan lebih mudah dilakukan
berikut cara untuk meresize temp tablespace :

SQL> SELECT tablespace_name, file_name, bytes
  2  FROM dba_temp_files WHERE tablespace_name = 'TEMP';
 
TABLESPACE_NAME   FILE_NAME                                 BYTES
----------------- -------------------------------- --------------
TEMP              /app/oradata/NEURON/temp01.dbf   2,107,200,000
 
 
SQL> ALTER DATABASE TEMPFILE '/app/oradata/NEURON/temp01.dbf' DROP INCLUDING DATAFILES;
 
DATABASE altered.
 
 
SQL> ALTER TABLESPACE temp ADD TEMPFILE '/app/oradata/NEURON/temp01.dbf' SIZE 512m
  2  AUTOEXTEND ON NEXT 250m MAXSIZE UNLIMITED;
 
TABLESPACE altered.
 
 
SQL> SELECT tablespace_name, file_name, bytes
  2  FROM dba_temp_files WHERE tablespace_name = 'TEMP';
 
TABLESPACE_NAME   FILE_NAME                                 BYTES
----------------- -------------------------------- --------------
TEMP              /app/oradata/NEURON/temp01.dbf      536,870,912

terkadang di sistem operasi windows command DROP INCLUDING DATAFILES tidak menghapus file fisik, untuk memastikannya anda perlu mencek terlebih dahulu, jika belum terhapus, hapus file dengan os Command.

Oracle ,

Call webMethods Flow Service with Java

December 29th, 2008

Berikut adalah contoh pemanggilan FLow Service di webMethods dari java. Asumsi dari environment yang digunakan adalah sebagai berikut :
Service yang dipanggil memiliki input nomor telepon dan output min dan iccid

berikut 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
package webmethods;
 
import com.wm.app.b2b.client.*;
import com.wm.data.IData;
import com.wm.data.IDataFactory;
import com.wm.data.IDataCursor;
import com.wm.data.IDataUtil;
 
/**
 *
 * @author gatotkaca
 */
public class Main {
 
    /** Creates a new instance of Main */
    public Main() {
         String server = "WMSERVER:WMPORT";
         String user = "WMUSER";
         String password = "WMPASSWORD";
         String mdn = "XXXXXXX";
         IData idata = IDataFactory.create();
         IDataCursor idc = idata.getCursor();
         IDataUtil.put(idc, "mdn", mdn);   
         idc.destroy();
 
 
    Context ctx = new Context();
        try {
            ctx.connect(server, user, password);
 
            idata = ctx.invoke("MDNQuery", "QueryMDN", idata);
            idc = idata.getCursor();
 
            String statusCode = IDataUtil.getString(idc,"statusCode");
            String fullStatusMsg = IDataUtil.getString(idc,"fullStatusMsg");
            String min = IDataUtil.getString(idc,"min");
            String iccid= IDataUtil.getString(idc,"iccid");
 
            System.out.println("Status Code = "+statusCode);
            System.out.println("fullStatusMsg = "+fullStatusMsg);
            System.out.println("MDN = "+mdn);
            System.out.println("MIN = "+min);
            System.out.println("ICCID = "+iccid);
 
 
 
        } catch (ServiceException ex) {
            ex.printStackTrace();
        }
 
 
       ctx.cleanUpConnection();
    }
 
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
 
        Main m = new Main();
    }
 
}

package com.wm.* ada di client.jar dan bisa dicopy dari library di webMethods dan tempatkan di classpath dari program anda. silahkan mencoba komentar, saran sangat diharapkan.

webMethods ,

Mengetahui Ukuran File dan Direktori

December 29th, 2008

Kita bisa menggunakan perintah du untuk mengetahui ukuran sebuah file seperti ini:

alam@NeuronServer:~> du linux-2.6.28.tar.bz2
51488   linux-2.6.28.tar.bz2

Nilai yang ditampilkan secara default dalam ukuran Kilobyte. Berarti ukuran source kernel diatas adalah 51488 Kilobyte.
du menyediakan opsi -h agar informasi yang ditampilkan lebih mudah dipahami:

alam@NeuronServer:~> du -h linux-2.6.28.tar.bz2
51M     linux-2.6.28.tar.bz2

Bagaimana apabila kita ingin mengetahui ukuran sebuah direktori? Penggunaannya seperti tadi:

alam@NeuronServer:~> du -h linux-2.6.28/
40K     linux-2.6.28/firmware/ttusb-budget
188K    linux-2.6.28/firmware/keyspan
264K    linux-2.6.28/firmware/emi26
144K    linux-2.6.28/firmware/edgeport
16K     linux-2.6.28/firmware/ess
...
92K     linux-2.6.28/kernel/irq
172K    linux-2.6.28/kernel/power
280K    linux-2.6.28/kernel/trace
3.2M    linux-2.6.28/kernel
476K    linux-2.6.28/block
344M    linux-2.6.28/

Perintah diatas kurang efektif karena menampilkan informasi ukuran semua file yang ada di direktori linux-2.6.28, padahal yang kita butuhkan hanya ukuran direktori linux-2.6.28 itu sendiri yang ditempatkan di baris paling akhir.
Untuk menyiasatinya lempar output dari perintah du ke perintah tail yang hanya akan menampilkan baris terakhir perintah du tersebut:

alam@NeuronServer:~> du -h linux-2.6.28/ | tail -1
344M    linux-2.6.28/

Opsi -1 dari tail untuk menentukan baris ke berapa yang akan ditampilkan. Defaultnya 10 baris terakhir.

Semoga bermanfaat and have a lot of fun!

Linux

Membuat Application Control Script

December 29th, 2008

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.sh

Jalankan skrip ini dengan perintah:

./server.sh

Explanation

Baris yang pertama berupa:

#!/bin/sh

merupakan 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.sh

Baris 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!

Linux , ,