短い答え

短い答え

背景

私は、Raspberry PIの温度をチェックし、温度が高すぎる場合は自動的にシャットダウンするスクリプト(質問の最後を参照)を書こうとしています。スクリプトはcronによって1分ごとに実行されます。ルートとして

問題

スクリプトが実行され、メッセージは期待どおりに印刷されますが、シャットダウンはスケジュールされておらず、その理由に関するエラー メッセージも表示されません。実際、cron がスクリプトを実行した後、cat /run/systemd/shutdown/scheduled何も表示されません (ファイルが存在しません)。ただし、スクリプトを手動で実行すると (まだ root として)、cat /run/systemd/shutdown/scheduledシャットダウンが実際にスケジュールされていることがわかります。

質問

スクリプトは手動で呼び出されると機能するのに、cron によって呼び出されると機能しないのはなぜですか (root の 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

スクリプトを手動で実行する(root として):

# ./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

Kusalanandaとgogoudは正しい。確認してみるといいcronメール

短い答え

交換する:

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。journald には期待するログ メッセージがすべてありましたが、再起動は機能しませんでした。cron-apt が定義を置く cron.d に私が持っていたものは次のとおりです。私はあなたが行ったのと同様に、すべてをカスタム スクリプトに分離しました。2 行目はテスト用です。

$ 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 -fcron ジョブの直後にメールについて通知されていることに気付きました。

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 が私にメールを送ってきました、または root です。

$ 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 件のメッセージを無視してしまいました。最後の 1 件を開いてみましょう。

& 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

関連情報