【发布时间】:2018-02-26 06:01:03
【问题描述】:
我有一个 Java 程序,它必须在数据库上运行才能重新索引条目。这是一项必须每周完成一次的工作。 我写了一个执行程序的脚本:
var=$(which java)
nohup $var -Xmx2048m -jar javaProgram.jar $* -d javaProgramResource -re > /nfs/inf/app_storage/logs/service/service_refresh.log 2>&1 &
我将 Java 路径放在变量中的原因是因为我希望它是通用的,我们在每个环境的不同位置安装了 Java。 通过手动执行此脚本,它可以完美运行。
./reindex.sh
现在,我想创建一个每周执行一次此脚本的 cron 作业(每个星期六早上 6 点 - 由于数据库中有很多条目,因此该作业的持续时间约为 16 小时)。
0 6 * * 6 cd /locattion/of/the/file; ./reindex.sh
我没有在日志文件中获取已编辑的索引(例如手动启动脚本时),而是收到一条消息:
nohup: invalid option -- 'X'
Try `nohup --help' for more information
我猜这是语法错误,但我不熟悉 bash 脚本和命令。
【问题讨论】:
-
尝试在
nohup语句之前的语句中添加set -x,以便打印您正在执行的命令。 -
大概问题是
which java没有返回任何东西。您应该引用变量替换,这样空变量就不会被视为不存在。 -
将
var=$(which java)替换为包含所有可能的 java 路径的 PATH 变量,并将下一行中的$var替换为java。 -
你不能在 crontab 脚本中这样通用。当 cron 运行您的脚本时,它不会继承您的环境设置。当您手动运行它时,which 命令仅因为它位于您的 $PATH 上而找到 java。但是当 cron 运行它时,它的 $PATH 变量可能为空或包含基本条目。
-
@LazarZoltan,我认为您在
/etc/environment中设置的内容将在全球范围内可用,即使对于 crond 也是如此,但我不确定 100%。