web-dev-qa-db-ja.com

スクリプトは、cronから実行されたときにファイルに書き込みません

/ 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
3
Sam
  1. 予想される場所にログファイルを取得するには、以下を置き換えます。

    LOG_FILE="test-crontab.log"
    

    と:

    LOG_FILE="/home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.log"
    
  2. コマンド[[ ${?} != 0 ]]はbash専用です。引用したエラーメッセージから、スクリプトは/bin/shの下で実行されているように見えます。これを修正する1つの方法は、次のものを交換することです。

    if [[ ${?} != 0 ]]; then
    

    と:

    if [ ${?} != 0 ]; then
    

    別のアプローチは、crontab -eを実行し、次の行をcrontabファイルに追加することです。

    Shell=/bin/bash
    
  3. また、シンプルさとスタイルのために、以下を置き換えることを検討してください。

    echo `date` >> ${LOG_FILE}
    

    で:

    date >> "${LOG_FILE}"
    

    これにより、エコーの無駄な使用がなくなります。

  4. 最後に、すべてのシェル変数、特に$LOG_FILEを二重引用符で囲むことを検討してください。 LOG_FILEの現在の値にはスペースもシェルアクティブ文字も含まれていないため、これは今は必要ありません。ただし、二重引用符で囲むと、将来の不快な驚きを防ぐことができます。

5
John1024

私の場合、作業ディレクトリは/home/meだったので、test-crontab.logのような相対パスはほとんど/home/me/test-crontab.logに解決されます

ファイルのパスを変更して移植性を低くするという考えが好きではなく、代わりに cronjob行のディレクトリを変更する

cd /path/to/directory && ./bin/myapp
0
Accountant م

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

コマンドをルートとして実行することを想定している

0
Nick Sillito