Cronjob이 스크립트를 실행하지 않음 하십시오. 그런 다음 기다렸다가

외부 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에서 발생합니다. 매우 최근에 업데이트 및 업그레이드되었습니다.



답변

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

나는 누군가가 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 내용이 변경 되어 작동하는 것처럼 보입니다. 다른 버그를 찾으면 계속 테스트하고 업데이트합니다.


답변

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

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