/ bin/bashスクリプトを実行すると、正常に動作し、スクリプト内のいくつかのログファイルにログインします。しかし、cronから実行すると、ファイルにログが記録されません!/var/mail/rootにログを記録するだけで、
Date: Fri, 12 Aug 2016 08:39:01 +0300 (MSK)
/bin/sh: 1: root: not found
これはスクリプトです:
#!/bin/bash
LOG_FILE="test-crontab.log"
echo "started testing cron" >> ${LOG_FILE}
pgrep tunnel
if [[ ${?} != 0 ]]; then
echo "Tunnel process is not running..." | tee -a ${LOG_FILE}
echo "initializing tunnel..." | tee -a ${LOG_FILE}
/usr/local/bin/stunnel | tee -a ${LOG_FILE} 2>&1
fi
echo `date` >> ${LOG_FILE}
そしてこれはcronです:
45 8 * * * /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh > /dev/null
予想される場所にログファイルを取得するには、以下を置き換えます。
LOG_FILE="test-crontab.log"
と:
LOG_FILE="/home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.log"
コマンド[[ ${?} != 0 ]]
はbash専用です。引用したエラーメッセージから、スクリプトは/bin/sh
の下で実行されているように見えます。これを修正する1つの方法は、次のものを交換することです。
if [[ ${?} != 0 ]]; then
と:
if [ ${?} != 0 ]; then
別のアプローチは、crontab -e
を実行し、次の行をcrontab
ファイルに追加することです。
Shell=/bin/bash
また、シンプルさとスタイルのために、以下を置き換えることを検討してください。
echo `date` >> ${LOG_FILE}
で:
date >> "${LOG_FILE}"
これにより、エコーの無駄な使用がなくなります。
最後に、すべてのシェル変数、特に$LOG_FILE
を二重引用符で囲むことを検討してください。 LOG_FILE
の現在の値にはスペースもシェルアクティブ文字も含まれていないため、これは今は必要ありません。ただし、二重引用符で囲むと、将来の不快な驚きを防ぐことができます。
私の場合、作業ディレクトリは/home/me
だったので、test-crontab.log
のような相対パスはほとんど/home/me/test-crontab.log
に解決されます
ファイルのパスを変更して移植性を低くするという考えが好きではなく、代わりに cronjob行のディレクトリを変更する
cd /path/to/directory && ./bin/myapp
Crontabエントリが間違っていると思います。
Ubuntu crontabファイルの形式は「m h dom mon dow user command」で、最初の5つのエントリはジョブの実行時間を指定します。 6番目のエントリはジョブを実行するユーザー(これはエントリにないと思います)、7番目のエントリは実行するコマンドです。
Crontab行を修正する必要があると思います
45 8 * * * root /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh>/dev/null
コマンドをルートとして実行することを想定している