오류 발생 후 컴퓨터를 다시 시작하는 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