在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$", "");

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Jemmy 的頭像
    Jemmy

    Jemmy Walker

    Jemmy 發表在 痞客邦 留言(0) 人氣()