![Ubuntu 18.04 尝试从 cron 运行的脚本重新启动时出现“无法打开 /dev/initctl:权限被拒绝”](https://linux22.com/image/171498/Ubuntu%2018.04%20%E5%B0%9D%E8%AF%95%E4%BB%8E%20cron%20%E8%BF%90%E8%A1%8C%E7%9A%84%E8%84%9A%E6%9C%AC%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%E6%97%B6%E5%87%BA%E7%8E%B0%E2%80%9C%E6%97%A0%E6%B3%95%E6%89%93%E5%BC%80%20%2Fdev%2Finitctl%EF%BC%9A%E6%9D%83%E9%99%90%E8%A2%AB%E6%8B%92%E7%BB%9D%E2%80%9D.png)
我有一个 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