GNU/Linux >> Linux の 問題 >  >> Linux

Bashscriptはターミナルからは機能しますが、Crontabからは機能しませんか?

たくさんのCronJobがありますが、1つを除いて正常に動作します。たくさんのフォーラムやウェブサイトを調べて、いくつかの組み合わせを試しましたが、残念ながら何も機能しませんでした。

質問の言い換えは次のとおりです。

Q: bashscriptは、ターミナルから問題なく動作します。ただし、CronJobではまったく機能しません。

デバッグのために最後に行ったことは次のとおりです。

1)Cronデーモンが実行されているかどうかを確認しました(ps ax | grep )=動作中

2)毎分(再テスト)メールを送信するための追加のcronジョブを作成しました(* * * * * echo "hello" | mail -s "subject" [email protected] )=正常に動作しました

3)スタンドアロンとしてターミナルを介してbashスクリプトを実行しました=正常に動作しました

4)grep CRON /var/log/syslogを確認しました エラーの場合=良さそう/エラーなし

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,nn$mc_id $mc_no has been switched on $difference_btwn_new_old_ign_values times within the last $time_difference_in_min minutesnnCheers," | 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日):
さらに、タイムスタンプを電子メールで送信する別の(より単純な)スクリプトを記述してCronTabを試し、タイムスタンプを.txtファイルに記録しました。これは問題なく機能しました。 CronTabが正常に機能していないのではないかと思ったので、書き直しました。

同様の問題を抱えている人のために、これらはあなたが考慮すべきいくつかのオプションです:
トラブルシューティング中に私がした他のこと(順番ではない)

  • プログラムが実行されているかどうかを確認するために、テキストファイルへのエコーアウトを作成しました
  • sudocrontab-eの使用は避けてください誰もがsudocrontab-eに近づかないことをお勧めします
  • crontab内のディレクトリパスを確認しました
  • さまざまなフォーラムを読んだり読み直したり、私のプログラムを何度も読んだり読み直したりします(プログラミングを理解している他の人にそれを実行してもらいます。新鮮な目で、見逃している可能性のあるものを見ることができます)
  • crontabにPATHとSHELLを追加しました
  • さまざまなCronJobを追加しました(更新18/02/15に記載)
  • すべてのプログラム内で相対パスをフルパスに変更しましたこれにより、crontabで機能するようになりました

承認された回答:

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

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

Linux
  1. コマンドShufファイル>ファイルは空のファイルを残しますが、同様のコマンドは残しませんか?

  2. エコー:コマンドが見つかりません

  3. スクリプトによるファイルの読み取りを許可するが、ユーザーがファイルを直接表示できないようにする

  1. rc.local でスクリプトを実行します:スクリプトは機能しますが、起動時には機能しません

  2. bashスクリプトを終了する方法はありますが、ターミナルを終了しない

  3. Linux 端末からメールを 1 行で送信する

  1. Postgres は localhost を許可していませんが、127.0.0.1 で動作します

  2. Pythonモジュールはターミナルでは見つかりませんが、Pythonシェル、Linuxでは見つかりません

  3. Linux サーバーで rsync/scp/sftp を許可するが、ターミナル ログインは許可しないようにする