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'

答え2

$PATH他の人が提案したように、インタラクティブな環境の外部から呼び出すことができるスクリプトを設定することは常に良い習慣です。

シェルからスクリプトを呼び出すと、cd最初に含まれているディレクトリにアクセスできます。ここでもこれを行う必要があります。

cronたとえば、スクリプトは/作業ディレクトリを使用して実行することができるため、プログラムのフルパスを使用するか、正しい作業ディレクトリに変更する必要があります。この場合、スクリプトがディスクに書き込まれるため、作業ディレクトリを変更する必要があり、出力ファイルがスクリプトと同じディレクトリにあることを望むようです。/var$PATH

crontabエントリでディレクトリを変更できます。

* * * * * cd /home/ed/enginecheck && ./engine.txt

またはスクリプト自体(他のコマンドの前):

cd /home/ed/enginecheck

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

答え3

私に役立つ解決策は、私が変わったということです。みんな私の2つのプログラムのパス比較的パスは次のとおりです。(./name_of_file.txt)〜いっぱいパス(例/home/ed/directory/some_more_directory/name_of_file.txt

これがただこのためか、私がした他のことの組み合わせなのかはわかりませんが、パスを相対パスからフルパスに変更すると効果がありました。

関連情報