シェルスクリプトでコマンドの出力を確認できますが、crontabでは同じことはできません。

シェルスクリプトでコマンドの出力を確認できますが、crontabでは同じことはできません。

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ジョブに何かを設定する必要があると思います。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

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=/rootcronではenv必要な.cfgファイルが/rootディレクトリに存在する必要があります。それ以外の場合は、お気に入りのmy.jarファイル.cfgパスを識別する必要があります。 .cfgファイルが指定されたパスにない場合、my.jar終了コードはjava -jar my.jar|grep ....0になります。

おすすめ記事