BashScript는 터미널에서는 작동하지만 CronTab에서는 작동하지 않습니다.

BashScript는 터미널에서는 작동하지만 CronTab에서는 작동하지 않습니다.

나는 여러 개의 CronJobs를 가지고 있는데 하나만 빼고는 잘 작동합니다. 나는 많은 포럼과 웹사이트를 탐색하고 여러 방법을 조합하여 시도했지만 불행히도 아무것도 작동하지 않았습니다.

질문을 바꿔 말하면 다음과 같습니다.

묻다: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

나에게 도움이 된 해결책은 내가 변화했다는 것입니다.모두내 두 프로그램의 경로비교적경로는 다음과 같습니다: ( ./name_of_file.txt) ~가득한경로(예: /home/ed/directory/some_more_directory/name_of_file.txt)

이것이 단지 이것 때문인지 아니면 내가 한 다른 일들의 조합인지는 모르겠지만 경로를 상대 경로에서 전체 경로로 변경하면 효과가 있었습니다.

관련 정보