我有一个 Python 程序,在出现错误后会重新启动计算机:
主要.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