
エラーが発生した後にコンピュータを再起動するPythonプログラムがあります。
main.py:
import os
if (some_error):
os.system('/sbin/reboot')
これを機能させるために、NOPASSWD
このスクリプトを実行しているユーザー用のsudoersファイルを追加しました。
/etc/sudoers:
adam ALL=NOPASSWD:/sbin/reboot
Pythonプログラムは、競合が発生しても実行を継続するために、単純なbashスクリプトを介して実行されます。
実行.sh:
#!/bin/bash
myscript(){
python3 main.py > log 2>&1
}
until myscript; do
echo "program crashed with exit code $?. Restarting..." >&2
sleep 1
done
このrun.sh
スクリプトは、再起動時にcronファイルを介して実行されます。
/etc/cron.d/my_cron_file:
@reboot adam cd /home/adam && ./run.sh
今私の問題は次のとおりです。 CLI で実行するか直接実行すると、正常に動作して再run.sh
起動main.py
します。ただし、@rebootでcronファイルを介して実行すると、次のように出力されます。
Failed to set wall message, ignoring: Interactive authentication required.
Failed to reboot system via logind: Interactive authentication required.
Failed to open /dev/initctl: Permission denied
Failed to talk to init daemon.
プロセスを調べてみると、ps aux
CLIで実行するときに機能するように、明示的に権限を持つユーザーとして実行されています。それでは、cronを使って実行したときになぜ機能しないのですか?adam
/sbin/reboot