Cronjob이 스크립트를 실행하지 않음


1

외부 IP 주소를 가져 와서 변경되었는지 확인하고있는 경우 이메일로 알려주는 스크립트를 만들었습니다.

적절하게 명명 된 스크립트는 다음과 같습니다 ip.sh(서버 호스트 이름은 "odin"입니다).

#!/bin/sh

# Start by renaming file "current-ip" to "old-ip"
mv -f  /var/www/html/scripts/current-ip  /var/www/html/scripts/old-ip
# Create new "current-ip" with the email's subject line
echo 'Subject: Odin has a new IP address' >> /var/www/html/scripts/current-ip
# Add a blank line
echo '' >> /var/www/html/scripts/current-ip
# Add some text to make the email slightly more readable
echo 'It seems as if a new IP address as been assigned to Odin:' >> /var/www/html/scripts/current-ip
# Get my external IP address and add it to a new line
curl http://ipecho.net/plain -w "\n" >> /var/www/html/scripts/current-ip
# Set permission to make the file readable and writeable
chmod 766 /var/www/html/scripts/current-ip

# Check to see if the newly built "current-ip" matches the old file
if diff /var/www/html/scripts/current-ip /var/www/html/scripts/old-ip >/dev/null ; then
# if it does, do nothing
exit
# Otherwise send that email!
else
  ssmtp -F"Odin" my_emial_address@gmail.com < /var/www/html/scripts/current-ip
fi

이것을 테스트하기 위해 현재의 ip 파일을 다른 것으로 편집 한 다음 스크립트를 실행하면 ./ip.sh매력처럼 작동합니다. "Odin"에서 내 새 IP 주소가 무엇인지 알려주는 이메일을받습니다. 환상적인.

이제 심볼릭 링크를 만듭니다.

ln /var/www/html/scripts/ip.sh /sbin/odinip

그리고를 실행하여 테스트하십시오 odinip. 완벽하게 작동합니다.

그런 다음 cronjob을 작성 crontab -e 하고 다음 줄을 입력하십시오.

*/5 * * * * /sbin/odinip

또한 cron이 작동하는지 확인하기 위해 다음 줄을 추가합니다.

*/5 * * * * env > /var/www/html/scripts/env.output

그런 다음 current-ipcronjob이 실행될 때 차이가 있는지 확인하기 위해 파일을 다시 편집 하십시오.

그런 다음 기다렸다가 기다립니다. env.output 파일이 작성되지만 이메일이 전송되지 않습니다.

syslog 확인 ( tail -n25 /var/log/syslog) :

May  9 13:40:01 odin CRON[7371]: (root) CMD (env > /var/www/html/scripts/env.output)
May  9 13:40:04 odin CRON[7341]: (CRON) info (No MTA installed, discarding output)
May  9 13:40:38 odin crontab[7429]: (root) BEGIN EDIT (root)
May  9 13:40:47 odin crontab[7429]: (root) END EDIT (root)
May  9 13:40:49 odin crontab[7451]: (root) BEGIN EDIT (root)
May  9 13:41:01 odin CRON[7478]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:41:16 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:42:46 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:41:30 odin crontab[7451]: (root) END EDIT (root)
May  9 13:41:31 odin crontab[7513]: (root) BEGIN EDIT (root)
May  9 13:41:44 odin crontab[7513]: (root) END EDIT (root)
May  9 13:41:46 odin crontab[7548]: (root) BEGIN EDIT (root)
May  9 13:42:01 odin CRON[7587]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:42:46 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:44:16 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:43:01 odin CRON[7690]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:43:41 odin crontab[7548]: (root) REPLACE (root)
May  9 13:43:41 odin crontab[7548]: (root) END EDIT (root)
May  9 13:44:01 odin cron[360]: (root) RELOAD (crontabs/root)
May  9 13:44:01 odin CRON[7771]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:44:18 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:45:48 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:45:01 odin CRON[7849]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)
May  9 13:45:01 odin CRON[7850]: (root) CMD (/home/jim/duckdns/duck.sh >/dev/null 2>&1)
May  9 13:45:01 odin CRON[7851]: (root) CMD (/sbin/odinip)
May  9 13:45:04 odin CRON[7829]: (CRON) info (No MTA installed, discarding output)
May  9 13:45:51 odin rsyslogd-2007: action 'action 17' suspended, next retry is Mon May  9 13:47:21 2016 [try http://www.rsyslog.com/e/2007 ]
May  9 13:46:01 odin CRON[7943]: (root) CMD (cd /var/www/html/scripts/ && ./cpuTemp.sh)

cpuTemp.sh내가 거기에서 실행 한 또 다른 스크립트입니다. Mail Transport Agent가없는 것 같습니다. 그러나 수동으로 실행할 때 어떻게 작동합니까?

추가 정보 : 모든 명령이 실행되고 파일이 편집되고 crontab이 루트로 수행됩니다.이 모든 것은 Jessie를 실행하는 Rasberry Pi 2에서 발생합니다. 매우 최근에 업데이트 및 업그레이드되었습니다.


오래 전에 저는 cron이 목록이 다시 시작될 때까지 목록이 수정되었음을 인식하지 못하는 SuSE 상자를 물려 받았습니다.
Gombai Sándor

답변:


1

오 와우. 답 : 전체 경로 사용

나는 누군가가 crontab에서 직접 ssmtp를 사용하는 데 문제가 있음을 알기 전까지는 그렇게했다고 생각했습니다.

그들은 가지고 있었다 :

0 9 * * * ssmtp a@hotmail.com < /home/a/a-msg.txt

그것을로 변경해야했습니다

0 9 * * * /usr/sbin/ssmtp a@hotmail.com < /home/a/a-msg.txt

분명히 문제를 해결했습니다.

반면에, bash 스크립트 ( ip.sh) 에서 ssmtp를 다음 행으로 참조했습니다.

ssmtp -F"Odin" my_emial_address@gmail.com < /var/www/html/scripts/current-ip

그래서 나는 그것을 업데이트했다.

/usr/sbin/ssmtp -F"Odin" my_emial_address@gmail.com < /var/www/html/scripts/current-ip

elseif 문을 강제로 실행하기 위해 현재 ip 내용이 변경 되어 작동하는 것처럼 보입니다. 다른 버그를 찾으면 계속 테스트하고 업데이트합니다.


0

Cron은 명령을 실행할 때 환경을 사용하거나 기억하지 않으므로 경로 및 기타 환경 변수가 예상과 다를 수 있습니다.

이미 알게 된 것처럼 문제를 피하는 가장 좋은 방법은 항상 cron에서 실행하는 명령의 전체 경로를 사용하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.