GNU/Linux >> Belajar Linux >  >> Linux

Bashscript Bekerja Dari Terminal Tetapi Tidak Dari Crontab?

Saya punya banyak CronJobs, dan mereka berfungsi dengan baik, kecuali satu. Saya telah melihat melalui banyak forum dan situs web, dan mencoba kombinasi beberapa hal, tetapi sayangnya tidak ada yang berhasil.

Mengulangi pertanyaannya adalah:

T: Bashscript berfungsi tanpa masalah dari terminal. Tetapi dengan CronJob itu tidak berfungsi sama sekali.

Hal terakhir yang saya lakukan untuk debugging adalah sebagai berikut:

1) Memeriksa apakah Cron Daemon sedang berjalan (ps ax | grep ) =bekerja

2) Membuat tugas chron ekstra untuk (menguji ulang) mengirimkan email kepada saya setiap menit (* * * * * echo "hello" | mail -s "subject" [email protected] ) =bekerja dengan baik

3) Saya telah menjalankan skrip bash saya melalui terminal sebagai standalone =bekerja dengan baik

4) Saya telah memeriksa grep CRON /var/log/syslog untuk setiap kesalahan =terlihat bagus/tidak ada kesalahan

5) Memeriksa izin dll. =tidak ada masalah dengan izin

6) Jalur file ke skrip bash untuk tugas cron terlihat baik

#!/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

dan 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

Saya telah memotong detail terkait email tersebut, tetapi baris tersebut berfungsi dengan baik.

Sejujurnya saya tidak tahu apa lagi yang bisa saya lakukan. Satu-satunya perbedaan dengan file bash ini adalah ia memanggil file 'executable txt' lain dari dalamnya. Dan kedua file ini bekerja dengan baik dari terminal sendiri.

Terkait:Bagaimana cara menampilkan hasil `top` yang diurutkan berdasarkan penggunaan memori secara real time?

Pembaruan (18/02/2015):
Saya telah mencoba CronTab lebih lanjut dengan menulis skrip lain (lebih sederhana) untuk mengirim stempel waktu melalui email, juga mencatat stempel waktu ke dalam file .txt – yang berfungsi tanpa masalah. Saya menulis ulang karena saya berpikir mungkin CronTab tidak berfungsi sebagaimana mestinya.

Bagi siapa saja yang mengalami masalah serupa, berikut adalah beberapa opsi yang harus Anda pertimbangkan:
Hal lain yang saya lakukan selama pemecahan masalah (tidak berurutan)

  • Membuat gema ke file teks untuk melihat apakah program sedang dijalankan
  • Dihindari menggunakan sudo crontab -e semua orang merekomendasikan untuk menjauh dari sudo crontab -e
  • Memeriksa jalur direktori di dalam crontab
  • Baca/baca ulang berbagai forum, baca/baca ulang program saya berulang-ulang (mintalah orang lain yang mengerti pemrograman untuk melakukannya, karena mata baru dapat melihat apa yang mungkin Anda lewatkan)
  • Menambahkan PATH dan SHELL ke crontab
  • Menambahkan CronJob yang berbeda (pembaruan yang disebutkan 18/02/15)
  • Mengubah jalur relatif ke jalur lengkap dalam semua program Ini membuatnya bekerja dengan crontab

Jawaban yang Diterima:

Saya pikir Anda perlu mengatur variabel path dalam skrip

Misalnya

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

Linux
  1. Mengapa Nullglob Tidak Default?

  2. Apakah File Command Shuf> File Meninggalkan File Kosong, Tapi Perintah Serupa Tidak??

  3. Unduh Gambar Berfungsi di FireFox tetapi tidak di Internet Explorer

  1. Bagaimana mencegah pengguna non-root membuat entri crontab

  2. Skrip Cron tidak Dieksekusi seperti yang Diharapkan dari crontab – Pemecahan Masalah

  3. Izinkan skrip untuk membaca file tetapi mencegah pengguna melihat file secara langsung

  1. Jalankan skrip dengan rc.local:skrip berfungsi, tetapi tidak saat boot

  2. Cara apa pun untuk keluar dari skrip bash, tetapi tidak keluar dari terminal

  3. mengirim email dari terminal linux dalam satu baris