BashScriptは端末では動作しますが、CronTabでは動作しません。

BashScriptは端末では動作しますが、CronTabでは動作しません。

私は複数のCronJobsを持っていますが、1つを除いてうまくいきます。私は多くのフォーラムやウェブサイトを閲覧し、いくつかの方法を組み合わせて試しましたが、残念ながら何も機能しませんでした。

質問を言い換えると、次のようになります。

尋ねる:bashスクリプトは問題なく端末で実行されます。しかし、CronJobの場合はまったく機能しません。

デバッグ用に最後に行った操作は次のとおりです。

1) Cronデーモンが実行中であることを確認します。 ( ps ax | grep) = 動作中

2)追加のタイミング操作を実行し(再テスト)、1分ごとに電子メールを送信しました()=うまくいきました。* * * * * echo "hello" | mail -s "subject" [email protected]

3)端末を介してスタンドアロンのbashスクリプトとして実行しました。 =うまく動作します。

grep CRON /var/log/syslog4)エラーがあることを確認しました=大丈夫です/エラーがありません

5) 権限の確認など = 権限に問題はありません。

6)cronを操作するためのbashスクリプトのファイルパスがよさそうです。

#!/bin/bash

#When adding any additional machines make sure there are two files
#within the directory. MACHINE_NAMEMACHINE_NUMBER_initial_time.txt
#and MACHINE_NAMEMACHINE_NUMBER_old_ignition_value.txt

#./engine_switch_check.txt MACHINE_NAME MACHINE_NUMBER

echo `date +%T` >> test.txt

./engine_switch_check.txt MXE 065
./engine_switch_check.txt TMX5BP 001
./engine_switch_check.txt MX3 122
./engine_switch_check.txt TMX 098

とengine_switch_check.txt:

#!/bin/bash

mc_id="$1"        #-->eg: TMX
mc_no="$2"        #-->eg: 098
echo "$mc_id $mc_no"

#echo "1--$mc_id$mc_no-DATAFILE.txt"
mc_fname=$mc_id$mc_no'_old_ignition_value.txt'
echo $mc_fname


#old_ignition_value=$(sed -n '1p' $mc_fname)
#echo "2--$old_ignition_value"
#old_ignition_value=$(sed -n '1p' $mc_id$mc_no'DATAFILE.txt')
#echo "3--$old_ignition_value"
new_ignition_value=`get values from the terminal`
old_ignition_value=$(sed -n '1p' $mc_id$mc_no'_old_ignition_value.txt')


echo "Program name: $0"
echo "New Ignition Value: $new_ignition_value"
echo "Old Ignition Value: $old_ignition_value"
echo;echo;echo

#difference_btwn_new_old_ign_values=$(awk '{print $1-$2}' <<< "$new_ignition_value $old_ignition_value")

difference_btwn_new_old_ign_values=$(($new_ignition_value - $old_ignition_value))
#difference_btwn_new_old_ign_values= expr new_ignition_value - old_ignition_value

echo "$new_ignition_value"
echo "$old_ignition_value"
echo "$difference_btwn_new_old_ign_values"

if [ "$difference_btwn_new_old_ign_values" -lt "1" ]
then
    > $mc_id$mc_no'_initial_time.txt'
    initial_time=`date +"%s"`    
    echo $initial_time >> $mc_id$mc_no'_initial_time.txt'
fi

if [ "$difference_btwn_new_old_ign_values" -ge "5" ]
then
    final_time=`date +"%s"`
    initial_time=$(sed -n '1p' $mc_id$mc_no'_initial_time.txt')
    echo;echo;echo "initial time: $initial_time"
    echo "final time: $final_time"
  #initial_time=0000
    time_difference_in_sec=$(( $final_time - $initial_time ))

    echo "time difference in sec: $time_difference_in_sec"

    time_difference_in_min=$(( $time_difference_in_sec / 60 ))


    if [ "$time_difference_in_sec" -le "3600" ]
    then
      email_subject="$mc_id $mc_no switched on $difference_btwn_new_old_ign_values times within $time_difference_in_min minutes"

            `echo -e "Hi there,\n\n$mc_id $mc_no has been switched on $difference_btwn_new_old_ign_values times within the last $time_difference_in_min minutes\n\nCheers," | mail -s "$email_subject" $email_list`

      echo "EMAIL SENT"

: <<'psuedo'

      > $mc_id$mc_no'_old_ignition_value.txt'
      echo $new_ignition_value >> $mc_id$mc_no'_old_ignition_value.txt'

psuedo
    fi  

    if [ "$time_difference_in_sec" -gt "3600" ]
    then

            > $mc_id$mc_no'_initial_time.txt'
            initial_time=`date +"%s"`    
            echo $initial_time >> $mc_id$mc_no'_initial_time.txt'


    fi
fi

メールの詳細を削除しましたが、回線は正常に機能します。

正直なところ、私が何を加えることができるかわかりません。このbashファイルとの唯一の違いは、他の「実行可能なtxt」ファイルを呼び出すことです。どちらのファイルも端末で正常に動作します。

更新(2015年2月18日): タイムスタンプを電子メールで送信する別の(より簡単な)スクリプトを作成し、タイムスタンプを.txtファイルに記録して、CronTabをさらに実験しました。問題なく動作しました。 CronTabが正常に動作しない可能性があると考えて書き直しました。

同様の問題が発生した場合に考慮すべきいくつかのオプションは次のとおりです。 トラブルシューティング中に実行したその他の操作(特定の順序なし)

  • プログラムが実行されていることを確認するために、テキストファイルのエコーを作成します。
  • sudo crontab -eを使用しないでください。誰もがsudo crontab -eを離れることをお勧めします。
  • crontabでディレクトリパスを確認する
  • さまざまなフォーラムを読む/やり直す、私のプログラムを読む/やり直す(プログラミングを知っている他の人にこれを行うようにして、あなたが見逃した可能性があるものを見ることができます)
  • crontabにPATHとSHELLを追加する
  • 別のCronJobを追加しました(更新18/02/15を参照)。
  • すべてのプログラムで相対パスをフルパスに変更するこれにより、crontabで使用できます。

ベストアンサー1

スクリプトでパス変数を設定する必要があると思います。

例えば

PATH='/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin'

おすすめ記事