Ubuntuシェルでスクリプトを.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
シェルスクリプト出力は常に「yes」ですが、crontab出力は常に「no」です。結果をキャプチャしようとすると
`java -jar /path/to/my.jar |grep -c 'Operation is done successfully.'`
コードではシェルでは8を返しますが、crontab操作では0を返します。終了コードだけでなく、コマンドの出力が結果であるかを判断するには、cronジョブに何かを設定する必要があると思います。env
Ubuntuコンテナの出力は次のとおりです。
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
env
これがcrontabで起こるものです。
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
ディレクトリに存在する必要があります。それ以外の場合は、お気に入りのmy.jar
ファイル.cfgパスを識別する必要があります。 .cfgファイルが指定されたパスにない場合、my.jar
終了コードはjava -jar my.jar|grep ....
0になります。