我可以在 shell 脚本中检查命令的输出,但无法在 crontab 中执行相同的操作

我可以在 shell 脚本中检查命令的输出,但无法在 crontab 中执行相同的操作

我可以在 ubuntu shell 中将我的脚本作为 .sh 文件运行,但是当从 cron 作业调用它时它不起作用。我将我的脚本运行到 ubuntu 容器(使用 docker)中

if [ `java -jar /path/to/my.jar |grep -c 'Operation is done successfully.'` -ge 8 ]; then
           echo "yes" 
else echo "no" 
fi

它正确地将 java 命令输出为数字,并将其与 8 和其余的进行比较。但是当我将这段代码放入 crontab 时,它失败了。 Cron作业代码如下:

 # Edit this file to introduce tasks to be run by cron.
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
JAVA_HOME=/usr/lib/jvm/java-7-oracle
# Each task to run has to be defined through a single line
 * *   *   *   *  if [ `java -jar /path/to/my.jar |grep -c 'Operation is done successfully.'` -ge 8 ]; then echo "yes"; else echo "no";fi

shell 脚本的输出始终为“yes”,但是 crontab 输出始终为“no”。当我尝试捕捉结果时

`java -jar /path/to/my.jar |grep -c 'Operation is done successfully.'`

代码中,它在 shell 中返回 8,但在 crontab 作业中返回 0。我认为必须在 cron 作业中配置一些东西来确定命令的输出可能是其结果,而不仅仅是退出代码。envubuntu容器中的输出是:

GIT_PS1_SHOWDIRTYSTATE=1
GREP_COLOR=1;31
MY_DB_ENV_MYSQL_DATABASE=my_db
HOSTNAME=my-core
MY_DB_ENV_MYSQL_ROOT_PASSWORD=mypass
TERM=xterm
CLICOLOR=1
MATCHER_OPTS=[]
LS_COLORS=di=34:ln=35:so=32:pi=33:ex=1;40:bd=34;40:cd=34;40:su=0;40:sg=0;40:tw=0;40:ow=0;40:
SPRING_PROFILES_ACTIVE=production
MY_DB_PORT_3306_TCP_PORT=3306
MY_DB_PORT_3306_TCP=tcp://172.17.0.2:3306
MY_DB_ENV_MYSQL_USER=myuser
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ARTIFACT_ID=unknown
PWD=/data
JAVA_HOME=/usr/lib/jvm/java-7-oracle
AES_DB_ENV_MYSQL_PASSWORD=mypass
PS1=\[\033[40m\]\[\033[33m\][ \u@\H:\[\033[32m\]\w$(__git_ps1 " \[\033[35m\]{\[\033[36m\]%s\[\033[35m\]}")\[\033[33m\] ]$\[\033[0m\]
MY_DB_ENV_MYSQL_VERSION=5.5.42
SHLVL=1
HOME=/root
GREP_OPTIONS=--color=auto
MY_DB_NAME=/my-core/my_db
MY_DB_PORT_3306_TCP_PROTO=tcp
MY_DB_PORT_3306_TCP_ADDR=172.17.0.2
MY_DB_ENV_MYSQL_MAJOR=5.5
MY_DB_PORT=tcp://172.17.0.2:3306
_=/usr/bin/env

envcrontab 中是这样的

HOME=/root
LOGNAME=root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/sh
JAVA_HOME=/usr/lib/jvm/java-7-oracle
PWD=/root

谁能告诉我发生这种情况的原因吗?提前致谢。

答案1

我解决了这个问题。原因是root用户执行了 cron 作业。通过将 STDERR 重定向到日志文件,我发现该my.jar文件需要额外的 .cfg 文件才能正确执行。正如您所注意到的,HOME=/root在 cron 中env,因此必要的 .cfg 文件必须位于/root目录中。否则,您应该将您最喜欢的 .cfg 路径识别到my.jar文件中。如果 .cfg 文件未放置在指定的路径中,my.jar则退出代码java -jar my.jar|grep ....将为 0(零)。

相关内容