스크립트는 터미널에서는 잘 실행되지만 Cron에서는 실행되지 않습니다.

스크립트는 터미널에서는 잘 실행되지만 Cron에서는 실행되지 않습니다.

cron터미널에서 이 스크립트를 실행하여 원하는 결과를 얻었지만 5분마다 실행되도록 설정하면 /root/somefolder/예상한 대로 수행되지 않습니다.

내 루트 사용자 crontab 항목은 다음과 같습니다.

*/5 * * * * ~root/somedirectory/script.sh

스크립트는 다음과 같습니다

#!/bin/bash

## Variables ##
host="`/bin/hostname`";

        ## Limits ##
OneMin="1";
FiveMin="6";
FifteenMin="6";

     ## Mail IDs ##
To="someone@somedomain"; Fr="root@"$host;

     ## Load Averages ##

LA=(`uptime | grep -Eo '[0-9]+\.[0-9]+' | cut -d"." -f1`)

      ## Top Process List ##

tp=(`ps -ef | sort -nrk 3,3 | grep -E "(php|httpd)" | grep -v root | head -n30 | awk '{print $2}'`)

## Actions ##

if [ ${LA[0]} -ge $OneMin ]; then

      ## Send Mail ##
echo -e "From: $Fr
To: $To
Subject: *ALERT* - Current Load on '$host' Is High Load Averages Are: \n\n 1:Min\t5:Min\t15:Min \n
${LA[0]}\t${LA[1]}\t${LA[2]} \n\n List Of Processes That Were Killed \n" | sendmail -t

## Kill Top Pocesses ##
for i in $tp ; do kill -9 $i
     done

fi

질문:

  1. 스크립트가 cron을 통해 실행되면 $To 변수의 모든 수신자는 if 문이 true인 경우에도 경고를 받지 않지만 터미널에서 실행되면 모든 사람이 이메일을 받게 됩니다.

  2. $To 변수를 읽지 않는다고 생각했기 때문에 모든 이메일 ID를 이와 같이 "받는 사람:" 필드에 직접 붙여넣어 보았습니다. 수신자: $To 대신 someone@somedomain

하지만 여전히 수신자 중 어느 누구도 경고를 받지 못했고 아무런 조치도 취하지 않은 것 같습니다.

답변1

sendmail스크립트에서 다음 구문을 사용해 보세요.

#!/bin/bash

# some code

/usr/sbin/sendmail -t <<EOF
To: [email protected] "$address1" "$address2"
Cc: [email protected] [email protected] [email protected]
Subject: [Monitoring] $foo $bar at $host
From: [email protected]

Monitoring for example.com server loss of connectivity - hourly update:
---------------------------------------------------------------------------

$some
$more
$variables

EOF

"heredoc" 블록에 변수를 포함할 수 있습니다.

스크립트 이름은 monitor.shcrontab에서 루트로 사용하는 항목입니다.

@hourly /root/monitor.sh

메일 전달이나 (실패한) 메일 전달과 관련된 문제를 sendmail확인할 수 있습니다 /var/log/maillog.

답변2

쉘 명령이 절대 경로를 작성해야 sendmail할 것 같으니 /usr/bin/sendmail. 나는 그것을 업데이트했고 cron이 작동하기 시작했습니다.

관련 정보