如何在 WindowsXP 上叫出 NetMeeting ㄌㄟ?

同事突然問說 WindowsXP 上怎麼沒有 NetMeeting ㄌㄟ?要怎麼把他叫出來啊?
呵呵,其實,WindowsXP 上面還是有附 NetMeeting 的,只是沒有捷徑罷了,他的路徑就在 C:\Program Files\NetMeeting\conf.exe 啦,直接執行或拉個捷徑出來就行了,當然也可以用下面的方式叫出來:
1. 由左下角的[開始]功能表,選 [執行]:

2. 敲入conf,按下碓定執行:
3. NetMeeting 打開囉...

不過我順便在另一台 Windows Vista 上試了一下,發現原來 Vista 上已經將 NetMeeting 拿掉,改成 Windows 會議室了;以下是 Microsoft 官方網站上的說明:
Microsoft Windows XP 是 Windows 的最後一個用戶端版本,其中包含 NetMeeting。 NetMeeting 並未隨附 Windows Vista。

為了在這種情況下支援目前的共同作業工作階段,Hotfix 是可用可讓您在 Windows Vista 架構的電腦上安裝 NetMeeting。此 NetMeeting 版本被作為轉換工具,可以協助支援共同作業工作階段當您在您的環境中使用 Windows XP 電腦搭配 Windows Vista 架構的電腦。

參考資料:
Microsoft 技術支援服務:Hotfix 是可以在執行 Windows Vista 的電腦上安裝 NetMeeting 3.02
(詳全文...)

SNMP on LINUX server 之 exec 自訂訊息實作

之前我們講到用 snmpd 裡面的 proc + 服務名稱來監視特定的服務狀態,但這只對部分的服務有效,例如 ntpd, snmpd, nfsd, httpd...等等,我不太確定他的抓取方式,但似乎,用 ps 去看如果 process name 沒出現在最前面的,似乎 snmpd 就 monitor 不到,這種狀況像 Tomcat 就會出現。舉例來說,我有個服務是用到 java 去帶起來的,如下面所示:
[root@KHXAAAS1 ~]# ps -aef|grep AAA|grep -v AAA
root 19475 1 0 09:13 ? 00:00:11 java -Xmx512m -Daaa.base=/opt/AAA -Daaa.run=/opt/AAA/run -Daaa.bin=/opt/AAA/bin -Daaa.lib=/opt/AAA/lib -Daaa.jni=/opt/AAA/jni com.lucent.aaa.gui.ServerManagementTool -debug info
root 21631 1 0 Sep12 ? 00:01:39 java -Daaa.base=/opt/AAA -Daaa.run=/opt/AAA/run -Daaa.bin=/opt/AAA/bin -Daaa.lib=/opt/AAA/lib -Daaa.jni=/opt/AAA/jni com.lucent.aaa.ConfigServer
root 26302 1 0 09:41 pts/0 00:00:08 java -Xmx512m -server -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -Dsun.rmi.dgc.server.gcInterval=0x7FFFFFFFFFFFFFFE -Dsun.rmi.dgc.client.gcInterval=0x7FFFFFFFFFFFFFFE -Daaa.base=/opt/AAA -Daaa.run=/opt/AAA/run -Daaa.bin=/opt/AAA/bin -Daaa.lib=/opt/AAA/lib -Daaa.jni=/opt/AAA/jni com.lucent.aaa.PolicyServer -debug debug
但用 snmpd 去監控 proc AAA 的話,一定看不到東西,(雖然可以用 proc Java 的方式來 monitor,但畢竟用 Java 帶起來的服務越來越多,這樣並不容易區分,容易造成誤判。)這個時候就可以用一個變通的方式來 monitor 我們要的服務狀態,那就是 exec 這個 snmpd.conf 裡的 option,他的用法是:
Usage:
exec MIBOID EXEC-COMMAND
我們直接實作一下好了。

首先假設我們有一個如前面說的服務用 proc AAA 方式加到 /etc/snmp/snmpd.conf 裡面卻無法正常 monitor 到服務的狀態時,而且假設,我們有一個簡單的判斷服務正常啟動的方法時(通常是像我們這裡示範的這種,灌了一個某某廠商的軟體時,想改變他的啟動方式或參數又無從改起時),如下所示,今天的實作目標有兩台 AAA server,上面有兩個主要的 process 要檢查狀態,
其中一個是 Policy server 另一個是 Configuration server,為了待會兒的測試,我先將其中第一台 KHXAAAS1 的 Policy server 先停掉,第二台 KHXAAAS2 的服務全部都讓他正常帶起來:
[root@KHXAAAS1 ~]# /opt/AAA/bin/aaa list all
The server could not be reached: Connection refused
8950 AAA Policy Server: not responding
101 Server active
8950 AAA Configuration Server: responding
[root@KHXAAAS2 ~]# /opt/AAA/bin/aaa list all
101 Server active
8950 AAA Policy Server: responding
101 Server active
8950 AAA Configuration Server: responding
說簡單點,/etc/snmpd/snmpd.conf 裡的 exec 這個 option 其實就是宣告一個 OID,然後當 SNMP server query 到這個 OID 時,就去執行指定的 shell scrpit 然後將直塞回剛剛指定的 OID.101.x 裡面去。接下來我們直接做一個簡單示範:

首先我們先 vi /etc/snmp/snmpd.conf(或用下面的 echo 指令也行)在裡面新加上一行如下的格式:
[root@KHXAAAS1 ~]# echo "exec .1.3.6.1.4.1.2021.51 ApplicationStatusQury /bin/sh /bin/ASQ.sh" >> /etc/snmp/snmpd.conf
檢查一下確實寫進去了:
[root@KHXAAAS1 ~]# grep ApplicationStatusQury /etc/snmp/snmpd.conf
exec .1.3.6.1.4.1.2021.51 ApplicationStatusQury /bin/sh /bin/ASQ.sh
接著我們編輯一個簡單的 shell script 叫 /bin/ASQ-AAA.sh 用來檢查 Policy server 和 Configuration server 的狀態,寫到 /opt/.ASQ-AAA-Policy.prState 與 /opt/.ASQ-AAA-Config.prState 裡面(這裡我先定義一下,如果這個file裡面的值是 responding 代表 服務正常,如果是 not responding 的話,代表服務掛點了,當然也可以用 wc -l 去讓這個 fiie 帶的值為 0 或 1 ):
[root@KHXAAAS1 ~]# cat /bin/ASQ-AAA.sh
#!/bin/sh
/opt/AAA/bin/aaa list policy > /opt/.ASQ-AAA-Policy.prState1
cat /opt/.ASQ-AAA-Policy.prState1|cut -d ":" -f2 > /opt/.ASQ-AAA-Policy.prState2
#grep 'not responding' /opt/.ASQ-AAA-Policy.prState1|wc -l > /opt/.ASQ-AAA-Policy.prState2

/opt/AAA/bin/aaa list config > /opt/.ASQ-AAA-Config.prState1
cat /opt/.ASQ-AAA-Config.prState1|cut -d ":" -f2 > /opt/.ASQ-AAA-Config.prState2
#grep 'not responding' /opt/.ASQ-AAA-Config.prState1|wc -l > /opt/.ASQ-AAA-Config.prState2
exit
然後我們再寫個 /bin/ASQ-AAA.sh 用來檢查 /opt/.ASQ-AAA-Policy.prState2 與 /opt/.ASQ-AAA-Config.prState2 裡面的值,分別寫進 1.3.6.1.4.1.2021.51.101.1 與 1.3.6.1.4.1.2021.51.101.2 這兩個 OID 去,如果你在剛剛的 schipt 裡面有 3 個 output,那就會還有 1.3.6.1.4.1.2021.51.101.3 這個 OID,依此類推...
[root@KHXAAAS1 ~]# cat /bin/ASQ.sh
#!/bin/sh
echo `cat /opt/.ASQ-AAA-Policy.prState2`
echo `cat /opt/.ASQ-AAA-Config.prState2`
exit
接著用 crontab -e 把他加進 cron job 去吧,這裡我們讓他每兩分鐘執行一次 Application Status Qury 的 script,可自行更改。
[root@KHXAAAS1 ~]# crontab -l
*/2 * * * * /bin/PSQ-AAA.sh
剛剛改完 /etc/snmp/snmpd.conf 之後我們還沒重起 snmpd 的服務,所以現在去查詢 .1.3.6.1.4.1.2021.51 這個 OID 應該會得倒下面的回應:
[root@KHXAAAS1 ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.51
UCD-SNMP-MIB::ucdavis.51 = No Such Object available on this agent at this OID
再來要開始驗證了,先確定一下兩台 AAA server 上的服務是把第一台的 Policy server 停下來的狀態,第二台則是保持 service 正常:
[root@KHXAAAS1 ~]# /opt/AAA/bin/aaa list all
The server could not be reached: Connection refused
8950 AAA Policy Server: not responding
101 Server active
8950 AAA Configuration Server: responding
[root@KHXAAAS2 ~]# /opt/AAA/bin/aaa list all
101 Server active
8950 AAA Policy Server: responding
101 Server active
8950 AAA Configuration Server: responding
接下來先重啟一下 snmpd service 來讓剛剛我們改的部分生效:
[root@KHXAAAS1 ~]# service snmpd restart
Stopping snmpd: [ OK ]
Starting snmpd: [ OK ]
好啦,現在可以查詢看看囉,先在本機上查詢一下(當然你也可以從你的 SNMP server 端來查詢) 我們剛剛新定義的 OID:
[root@KHXAAAS1 ~]# snmpwalk -v 2c -c public localhost .1.3.6.1.4.1.2021.51
UCD-SNMP-MIB::ucdavis.51.1.1 = INTEGER: 1
UCD-SNMP-MIB::ucdavis.51.2.1 = STRING: "ApplicationStatusQury"
UCD-SNMP-MIB::ucdavis.51.3.1 = STRING: "/bin/sh /bin/ASQ.sh"
UCD-SNMP-MIB::ucdavis.51.100.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "not responding"
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "responding"
UCD-SNMP-MIB::ucdavis.51.102.1 = INTEGER: 0
UCD-SNMP-MIB::ucdavis.51.103.1 = ""
如果是用 wc -l 去 count 的話那應該會像下面這樣:
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "1"
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "0"
當然在這裡我們需要的是 .1.3.6.1.4.1.2021.51.101.1 and .1.3.6.1.4.1.2021.51.101.2 這兩個 OID,對應到 Policy server 和 Configuration server 的服務狀態。所以由 SNMP server 端就可以直接設定一個 Passive Monitor 來 Polling 這兩個 OID 的值。
[root@KHXEMSS1 ~]# snmpwalk -v 2c -c public khxaaas1 .1.3.6.1.4.1.2021.51.101.1
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "not responding"
[root@KHXEMSS1 ~]# snmpwalk -v 2c -c public khxaaas1 .1.3.6.1.4.1.2021.51.101.2
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "responding"
[root@KHXEMSS1 ~]# snmpwalk -v 2c -c public khxaaas2 .1.3.6.1.4.1.2021.51.101.1
UCD-SNMP-MIB::ucdavis.51.101.1 = STRING: "responding"
[root@KHXEMSS1 ~]# snmpwalk -v 2c -c public khxaaas2 .1.3.6.1.4.1.2021.51.101.2
UCD-SNMP-MIB::ucdavis.51.101.2 = STRING: "responding"
所以上面就代表第一台 KHXAAAS1 的 Policy server 有問題。OK...報告完畢。
(詳全文...)

用 mysqldump 來 Backup/Restore MySQL 的 DB data

今天收到客戶的要求要把 DB server 上的 MySQL data 做個定期備份,所以就順便實作一下~
首先,這裡的環境是:

兩台 DB server 上都有 MySQL Enterprise v2.0.56,
OS 都是 RedHat EL ES4U5,另外這兩台 DB server 上還有 Veritas 做 HA。
我們就不說廢話了,直接開始吧:

MySQL 備份資料庫主要有兩種方法,一種是用 Hard copy 的方法,也就是直接把 ~/mysql/data/[資料庫名稱]/* 通通備份下來,如果要到回去資料庫,資料庫版本要一樣喔,免得發生非預期的結果。不過這種方法備份還原時最好先把 mysqld 停下來。
要看 MySQL 是否執行中可用下面的指令 "mysqladmin status":
[root@KHXDBS1 ~]# /opt/mysql/enterprise/monitor/mysql/bin/mysqladmin status
/opt/mysql/enterprise/monitor/mysql/bin/mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysql.sock' exists!
而要檢查剛剛所說的資料庫所在的位置,可以去查看一下 /etc/init.d/mysql 個檔案的內容,由於這裡的環境是兩台 DB server 後面接著一座 Storage,所以我把 datadir (資料庫路徑) 改到 /DB (由後端 Storage mount 過來)底下:
[root@KHXDBS1 ~]# grep "datadir=/" /etc/init.d/mysql
# datadir=/var/lib/mysql
datadir=/DB/var/lib/mysql
[root@KHXDBS1 ~]# cp -pR /DB/var/lib/mysql/AAA /DB/mysql/backup/.
其中 AAA 是這次要備份的的 schema 啦。

還有一種作法是用 mysqldump 將資料倒出來 *.sql,指令格式為:
mysqldump -h [Host] -u[DbUserName] -p[DbPassword] [DbName] > [filename].sql
簡單的例子:
mysqldump -h 127.0.0.1 -uroot -pOOXX AAA > /DB/mysql/backup/dbMysqlArchive_XXXX.sql
要做 Restore 時可以用下面的指令範例來倒:
mysql -h 127.0.0.1 -uroot -pOOXX AAA < /DB/mysql/backup/dbMysqlArchive_XXXX.sql
對了,Restore 之前要先確定 AAA 的 Schema 還存在喔~
下面是附上簡單寫的一個小 script 去每天晚上作個備份...給大家參考一下:
[root@KHXDBS1 ~]# crontab -l 10 2 * * * /bin/DB_archive.sh > /dev/null 2>&1
[root@KHXDBS1 ~]# cat /bin/DB_archive.sh
#!/bin/sh -vx
#
# DB server : Backup DB data
# Version: @01
#
INITIAL_DIR=/opt/logs
HOSTNAME=`hostname |cut -c -7`
LOG_APPENDIX=`date +"%Y-%m%d"`
LOCK_FILE=$INITIAL_DIR/.dbMysqlArchive_lock
LOG_FILE=$INITIAL_DIR/$HOSTNAME-dbMysqlArchive_$LOG_APPENDIX.log
ERR_COUNTER=0
FIX_COUNTER=0
MAIN_SEPERATOR="==============="
SEC_SEPERATOR="#---------------------------------------------------------------------------------------#"
NOW=`date +%Y-%m-%d-%H:%M:%S`
ARC_EXT=`date +%Y%m%d%H`
ARC_DIR=/DB/mysql/backup
ARC_FILE=$ARC_DIR/dbMysqlArchive_$ARC_EXT.sql

if [ ! -f "$LOCK_FILE" ]; then
touch $LOCK_FILE
else
echo $MAIN_SEPERATOR >> $LOG_FILE
echo $NOW >> $LOG_FILE
echo "$LOCK_FILE exist" >> $LOG_FILE
echo $MAIN_SEPERATOR >> $LOG_FILE
exit
fi

if [ `rsh khxdb hostname|cut -c -7|grep $HOSTNAME|wc -l` = 1 ]; then
/usr/bin/find $INITIAL_DIR -name "$HOSTNAME-dbMysqlArchive*.log" -mtime +8 -exec rm {} \;
/usr/bin/find $ARC_DIR -name "dbMysqlArchive_*.sql" -mtime +8 -exec rm {} \;

echo $SEC_SEPERATOR >> $LOG_FILE
echo "# DB server mysql data archive script starting #" >> $LOG_FILE
echo $SEC_SEPERATOR >> $LOG_FILE
#------------------------ Archive MySQL data ----------------------------------------------#
echo "Start to excute mysqldump command at $NOW ..." >> $LOG_FILE
echo "" >> $LOG_FILE
/opt/mysql/enterprise/monitor/mysql/bin/mysqldump -h 127.0.0.1 -uroot -pOOXX AAA > $ARC_FILE
if [ `ls -l $ARC_FILE| wc -l` = 1 ]; then
echo "$ARC_FILE created..." >> $LOG_FILE
else
echo "$ARC_FILE create fail, Please check it now..." >> $LOG_FILE
fi
rm -rf $LOCK_FILE
echo $SEC_SEPERATOR >> $LOG_FILE
echo "# DB server MySQL data archive script finished #" >> $LOG_FILE
echo $SEC_SEPERATOR >> $LOG_FILE
#------------------------------------------------------------------------------------------#
else
echo $NOW >> $LOG_FILE
echo "This server is NOT the active one !!!" >> $LOG_FILE
echo "Check script is stopping !!!" >> $LOG_FILE
echo $SEC_SEPERATOR >> $LOG_FILE
rm -rf $LOCK_FILE
fi
[root@KHXDBS1 ~]#
備份完會像下面所示的例子喔:
[root@KHXDBS1 ~]# ls -alrt /DB/mysql/backup/
total 168
drwxr-xr-x 3 root root 4096 Oct 14 15:25 ..
-rw-r--r-- 1 root root 77092 Oct 15 02:10 dbMysqlArchive_2008101502.sql
drwxr-xr-x 2 root root 4096 Oct 14 15:55 .

搞定!收工。
(詳全文...)

讓 history command 顯示時間記錄 on LINUX

有時候在機器上查詢曾經下過的指令記錄時,多半大家看到的都是如下面的格式吧:
[root@KHXPROVS1 ~]# history
1 ifconfig -a;
2 service ntpd status; ntpq -p;
3 df -h;
4 service vsftpd status;
5 history
[root@KHXPROVS1 ~]#
可是如果這台機器有很多人都會進來用的話呢?那我怎麼知道某個特別的指令是在什麼時間下的呢?能不能在 history 秀出的紀錄裡加上時間戳記呢?當然可以,在 bash 的變數裡面有一個叫 HISTTIMEFORMAT 就可以達到這麼需求,我們就來實作一下吧:

首先,這個變數必須在 BASH 3.0 以上才有提供喔,如果以 RedHat Enterprise 的版本來看 , 要 RHEL 4 ES/AS 以後的版本才行!

先確認一下目前 BASH 的版本吧:
[root@KHXPROVS1 ~]# rpm -q bash
bash-3.0-19.3
看來版本是 OK 的,接著編輯一下 /etc/profile 或者直接用下面的指令把變數宣告進去:
echo "HISTTIMEFORMAT='<%F %T>:'" >> /etc/profile
echo "export HISTTIMEFORMAT" >> /etc/profile
當然,編輯完的話,存檔離開,接著用:
[root@KHXPROVS1 ~]# source /etc/profile
或者離開目前的 shell 再登入一次,然後再敲一次 history 指令看一下結果:
[root@KHXPROVS1 ~]# history
1 <2008-10-08 18:02:22>ifconfig -a;
2 <2008-10-08 18:02:22>service ntpd status; ntpq -p;
3 <2008-10-08 18:02:22>df -h;
4 <2008-10-08 18:02:22>service vsftpd status;
5 <2008-10-08 18:02:22>history
6 <2008-10-08 18:02:22>rpm -q bash
7 <2008-10-08 18:02:22>echo "HISTTIMEFORMAT='<%F %T>:'" >> /etc/profile
8 <2008-10-08 18:02:22>echo "export HISTTIMEFORMAT" >> /etc/profile
9 <2008-10-08 18:02:22>source /etc/profile
10 <2008-10-08 18:03:15>history
[root@KHXPROVS1 ~]#
果然,每個歷史指令的前面都多了時間戳記囉~

參考資料:GNU 官網的 5.2 Bash Variables
(詳全文...)

在 Linux 上增加一個新服務並設為開機啟動

上次裝完 JAVA 跟 Tomcat 之後,是用手動的方式將 Tomcat 的服務帶起來的,(啟動:/opt/tomcat/bin/startup.sh 停止:/opt/tomcat/bin/shutdown.sh)這次我們要做的就是將 Tomcat 加為系統的一個服務,改為可用 service service_name start/stop 的方式來啟動跟關閉:

首先,我們先到 /etc/init.d/ 底下去新增一個 tomcat 的檔案 (記得要改為可執行喔~)
[root@KHXPROVS1 ~]# touch /etc/init.d/tomcat
[root@KHXPROVS1 ~]# chmod 755 /etc/init.d/tomcat
[root@KHXPROVS1 bin]# ls -alrt /etc/init.d/ |grep tomcat
-rwxr-xr-x 1 root root 609 Oct 2 16:10 tomcat
編輯 /etc/init.d/tomcat 的內容,這個檔案的寫法可以參考系統上面 /etc/init.d/ 下的其他檔案;
比較重要的是第二行,其語法為:
# chkconfig: [runlevels] [start number] [stop number]
# runlevels 代表不同的 run level 狀態, start number 與 stop number 則是在 /etc/rc.d/rc[2345].d 內建立以 S90tomcat 及 K80tomcat 為檔名的設定。
[root@KHXPROVS1 ~]# vi /etc/init.d/tomcat
#!/bin/bash
# process init file for tomcat
#
# chkconfig: 2345 90 80
# description: Apache Tomcat Daemon
#
# processname: /opt/tomcat/bin/startup.sh and /opt/tomcat/bin/shutdown.sh

start() {
echo -n "Starting up Tomcat: ";echo "";
/opt/tomcat/bin/startup.sh
}

stop() {
echo -n "Shutting down Tomcat: ";echo "";
/opt/tomcat/bin/shutdown.sh
}

restart() {
echo "Restarting Tomcat:"
stop
start
}

case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
*)
echo "Usage: Tomcat {start|stop|restart}"
exit 1
esac

exit $?
~
~
~
~
"/etc/rc.d/init.d/tomcat" 39L, 524C written
修改完存檔離開,接著我們檢查一下目前 tomcat 是否有啟動:
[root@KHXPROVS1 ~]# ps -aef|grep tomcat
root 22754 22207 0 15:53 pts/2 00:00:00 grep tomcat
好了,現在就來測試一下剛剛的檔案囉,首先,測試一下啟動 tomcat 服務吧:
[root@KHXPROVS1 ~]# service tomcat start
Starting up Tomcat:
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /usr
[root@KHXPROVS1 ~]# ps -aef|grep tomcat|grep -v grep
root 22775 1 30 15:53 pts/2 00:00:11 /usr/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.endorsed.dirs=/opt/tomcat/endorsed -classpath :/opt/tomcat/bin/bootstrap.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start
接著,測試一下停止 tomcat 服務吧:
[root@KHXPROVS1 ~]# service tomcat stop
Shutting down Tomcat:
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /usr
[root@KHXPROVS1 ~]# ps -aef|grep tomcat|grep -v grep
最後,測試一下重新啟動 tomcat 服務吧:
[root@KHXPROVS1 ~]# service tomcat restart
Restarting Tomcat:
Shutting down Tomcat:
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /usr
Starting up Tomcat:
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /usr
[root@KHXPROVS1 ~]# ps -aef|grep tomcat|grep -v grep
root 23001 1 99 15:55 pts/2 00:00:07 /usr/bin/java -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties -Djava.endorsed.dirs=/opt/tomcat/endorsed -classpath :/opt/tomcat/bin/bootstrap.jar -Dcatalina.base=/opt/tomcat -Dcatalina.home=/opt/tomcat -Djava.io.tmpdir=/opt/tomcat/temp org.apache.catalina.startup.Bootstrap start
[root@KHXPROVS1 ~]#
接下來要讓 tomcat 在次開機時都會自動啟動,這裡我們用 chkconfig 這個指令來達成,
先用 --list 將目前的各項服務狀態列出來並 grep 一下 tomcat:
[root@KHXPROVS1 ~]# chkconfig --list|grep tomcat
看的出來目前 tomcat 並不在 chkconfig 的管理列表中,所以我們用 --add 來新增 tomcat 的服務 (增加一個服務名稱給 chkconfig 來管理,該服務名稱 必須存在 /etc/init.d/ 內!)
[root@KHXPROVS1 ~]# chkconfig --add tomcat
[root@KHXPROVS1 ~]# chkconfig --list|grep tomcat
tomcat 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@KHXPROVS1 ~]#
我們列出 /etc/rc.d/rcx.d/ 底下關於 tomcat 的部分:
[root@KHXPROVS1 ~]# find /etc/rc.d/ |grep 'tomcat'|sort
/etc/rc.d/init.d/tomcat
/etc/rc.d/rc0.d/K80tomcat
/etc/rc.d/rc1.d/K80tomcat
/etc/rc.d/rc2.d/S90tomcat
/etc/rc.d/rc3.d/S90tomcat
/etc/rc.d/rc4.d/S90tomcat
/etc/rc.d/rc5.d/S90tomcat
/etc/rc.d/rc6.d/K80tomcat
好了,報告完畢~
(詳全文...)