짧은 답변

짧은 답변

배경

저는 Raspberry PI의 온도를 확인하고 온도가 너무 높아지면 자동으로 종료하는 스크립트(질문 끝 참조)를 작성하려고 합니다. 이 스크립트는 매분마다 cron에 의해 실행됩니다.루트 사용자로.

질문

예상대로 스크립트가 실행되고 메시지가 출력되지만 종료가 예약되지 않았으며 원인에 대한 오류 메시지도 없습니다. 실제로 cron이 스크립트를 실행한 후에는 cat /run/systemd/shutdown/scheduled아무 것도 표시되지 않습니다(파일이 존재하지 않음). 그러나 스크립트를 수동으로(여전히 루트로) 실행하면 cat /run/systemd/shutdown/scheduled종료가 실제로 예약되었음을 알 수 있습니다.

질문

수동으로 호출하면 스크립트가 작동하지만 cron을 통해 호출하면 스크립트가 작동하지 않는 이유는 무엇입니까(루트의 crontab에 있음에도 불구하고)?

관련된

이 문제비슷하지만 답변에 대한 결론은 폐쇄를 추가하는 것 같습니다.뿌리crontab( crontab -e내가 한 일을 통해)은 괜찮을 것입니다.

세부 사항

스크립트:/root/shutdown_overheat.sh

#!/bin/sh

MAXTEMP=30         # temporarily lowered for testing
TEMP=$(/opt/vc/bin/vcgencmd measure_temp | awk -F'[=.]' '{print $2}')
MSG="Temperature $TEMP higher than $MAXTEMP, shutting down in 2 minutes"

if [ "$TEMP" -gt "$MAXTEMP" ]; then
        wall $MSG
        logger System $MSG
        shutdown -h +2 $MSG
fi

스크립트를 수동으로 실행하십시오(루트로):

# ./shutdown_overheat.sh 

Broadcast message from attilio@kolcsag (pts/0) (Fri Mar 13 20:41:13 2020):     

Temperature 54 higher than 30, shutting down in 2 minutes

Shutdown scheduled for Fri 2020-03-13 20:43:13 GMT, use 'shutdown -c' to cancel.
# cat /run/systemd/shutdown/scheduled 
USEC=1584132193792504
WARN_WALL=1
MODE=poweroff
WALL_MESSAGE=Temperature 54 higher than 30, shutting down in 2 minutes

cron에 의해 실행되는 스크립트:


Broadcast message from root@kolcsag (somewhere) (Fri Mar 13 20:42:01 2020):    

Temperature 54 higher than 30, shutting down in 2 minutes

# cat /run/systemd/shutdown/scheduled 
cat: /run/systemd/shutdown/scheduled: No such file or directory

루트의 crontab:

# crontab -l



# Edit this file to introduce tasks to be run by cron.
# 
# ... etc

* * * * * /root/shutdown_overheat.sh

답변1

Kusarananda와 Gogu가 옳습니다. 당신은 그것을 확인해야합니다예약된 작업 이메일.

짧은 답변

바꾸다:

if [ "$TEMP" -gt "$MAXTEMP" ]; then
        wall $MSG
        logger System $MSG
        shutdown -h +2 $MSG
fi

그리고:

if [ "$TEMP" -gt "$MAXTEMP" ]; then
        wall $MSG
        logger System $MSG
        /usr/sbin/shutdown -h +2 $MSG
fi

또는 바이너리( whereis -b shutdown)는 어디에 있습니까?

긴 대답

구현해 보았습니다cron-apt있는 경우 다시 시작하십시오 /var/run/reboot-required. 예상되는 모든 로그 메시지를 기록했지만 다시 시작해도 작동하지 않습니다. 이것이 cron-apt가 정의하는 cron.d에 있는 것입니다. 나는 당신이 한 것과 비슷하게 모든 것을 사용자 정의 스크립트로 분리했습니다. 두 번째 줄은 테스트용입니다.

$ sudo cat /etc/cron.d/cron-apt
45 3 * * *  root  "/usr/local/bin/cron-apt-server"
*/10 * * * *  root  "/usr/local/bin/cron-apt-server"

10분마다 시도하기 전에 cron.hourly를 시도했습니다.

$ sudo ln -sf /usr/local/bin/cron-apt-server /etc/cron.hourly/

성공! 이제 나는 더욱 혼란스러워졌습니다!

내 스크립트가 확인한 파일을 다시 만들었습니다.sudo touch /var/run/reboot-required{,.pkgs}; echo test | sudo tee -a /var/run/reboot-required.pkgs

cron.d를 다시 테스트했습니다. 그런 다음 journalctl -f내 cron 작업이 종료된 직후에 메일에 대해 알려주는 것을 발견했습니다 .

Mär 10 14:35:24 studentvm1 cron-apt-server[5260]: Rebooting for packages: test
Mär 10 14:35:24 studentvm1 CRON[3037]: pam_unix(cron:session): session closed for user root
Mär 10 14:35:24 studentvm1 postfix/pickup[1998]: A4346601AA6: uid=0 from=<root>
Mär 10 14:35:24 studentvm1 postfix/cleanup[5264]: A4346601AA6: message-id=<20210310133524.A4346601AA6@ubuntu-server>
Mär 10 14:35:24 studentvm1 postfix/qmgr[1999]: A4346601AA6: from=<root@ubuntu-server>, size=1444, nrcpt=1 (queue active)

Postfix가 방금 나에게 이메일이나 루트를 보냈습니다.

$ sudo mail
Mail version 8.1.2 01/15/2001.  Type ? for help.
"/var/mail/root": 21 messages 21 new

[...]

 N 21 root@ubuntu-serve  Wed Mar 10 14:30   38/1551  Cron <root@studentvm1>  "/usr/local/bin/cron-apt-server"

이런, 21개의 메시지를 무시했습니다. 마지막을 열어보겠습니다.

& 21

Message 21:
From root@ubuntu-server  Wed Mar 10 14:30:01 2021
X-Original-To: root
From: root@ubuntu-server (Cron Daemon)
To: root@ubuntu-server
Subject: Cron <root@studentvm1>  "/usr/local/bin/cron-apt-server"
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
Date: Wed, 10 Mar 2021 14:30:01 +0100 (CET)

[...]

+ [[ -f /var/run/reboot-required ]]
+ [[ server == \s\e\r\v\e\r ]]
++ cat /var/run/reboot-required.pkgs
+ msg='Rebooting for packages: test'
+ logger_notice 'Rebooting for packages: test'
+ logger -p notice -t cron-apt-server 'Rebooting for packages: test'
+ shutdown -r now 'Rebooting for packages: test'
/usr/local/bin/cron-apt-server: line 66: shutdown: command not found

& q

그래서 얻었습니다. line 66: shutdown: command not found교체했고 shutdown효과 /usr/sbin/shutdown가 있었습니다!

접두사가 붙은 줄은 +디버깅을 위한 설정에 의해 생성됩니다.set -x

편집: 또한 참조https://askubuntu.com/a/13733/40581

관련 정보