在Perl裡透過systtem或用雙倒引號(`)執行外部程式可以。但使用crontab卻不行,前提確認了權限已足,經Google大師開示,要先執行profile。
下command:crontab -e進入vi編輯:
# 分 時 日 週 月 命令
00 21 * * * (. /oracle/.profile; /home/ogg/launcher.pl)
也學到原來crontab的命令不一定只限一行,也可以用小括號括起,用分號隔成數道命令。
然而,system或雙倒引號括起的java程式,如:nohup run.sh &。run.sh內容是java –jar my.jar,卻無法Run成功,原因還是和profile有關。只需在run.sh做以下編輯:
JAVA_HOME=/usr/java5
CLASSPATH=.:./lib
export JAVA_HOME CLASSPATH
java -jar -cp $CLASSPATH -Xms1G -Xmx4G /home/jemmy/my.jar
不只宣告JAVA_HOME和CLASSPATH環境變數,要被crontab執行,其jar檔還要附上絕對路徑。此外,若程式裡有遇到需要讀相對路徑的配置檔,也就不能像Spring一樣在ClassPath被搜尋到,又該如何?
以本例來看,是用oracle這個user登入(. /oracle/.profile),也表示相對路徑之基準路徑為/oracle,而my.jar程式可以透過如下方式取得該jar絕對路徑:
String classPath = MyClass.class.getProtectionDomain().getCodeSource().getLocation().getPath();
其classPath會是/home/jemmy/my.jar。是故剔掉my.jar即絕對路徑:classPath.replaceAll("[^/]+\\.jar$", "");