Short: у меня есть python скрипт, который я хотел бы установить как сервис. Тем не менее, он завершается при запуске в качестве службы, а не при запуске вручную как root.
Полный: у меня есть физический ЖК-дисплей HD44780, подключенный к серверу, на котором отображаются различные диагностические сообщения. Данные собираются с помощью скрипта python, который должен запускаться с python2 и иметь права root. Сценарий по сути всего 1045 *, который собирает информацию, вычисляет некоторые значения и записывает на ЖК-дисплей. В дальнейшем он возвращается в спящий режим на 5 секунд и делает это снова.
Я хотел бы запустить его как службу и следовал этому руководству: Запуск сценария python при запуске с помощью службы Systemd
Мой Python сценарий размещен в / etc / opt / lcdsysinfo.py и выглядит примерно так:
def runCycle():
calculate values....
time.sleep(5) <--line 121
print on lcd
while True:
runCycle() <-- line 170
Сервисный файл находится в / etc / systemd / system / lcdsysinfo.service
[Unit]
Description=Service running system info LCD
After=network.target
[Service]
Type=simple
PIDFile=/var/run/lcdsysinfo.pid
ExecStart=/usr/bin/python2 "/etc/opt/lcdsysinfo.py >>/var/log/lcdsysinfo.log 2>&1"
TimeoutStartSec=0
Restart=on-failure
[Install]
WantedBy=default.target
и у меня есть текстовый файл с возможностью записи в / var / log / lcdsysinfo.log
После этого я набрал
sudo systemctl enable lcdsysinfo
sudo systemctl start lcdsysinfo
На дисплее ничего не происходит, и если я посмотрю на
systemctl status lcdsysinfo
, я получу
lcdsysinfo.service - Service running system info LCD
Loaded: loaded (/etc/systemd/system/lcdsysinfo.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Sun 2020-01-05 16:04:17 CET; 9min ago
Main PID: 6469 (code=exited, status=2)
Jan 05 16:04:17 bo-stationary systemd[1]: lcdsysinfo.service: Service hold-off time over,
scheduling restart.
Jan 05 16:04:17 bo-stationary systemd[1]: lcdsysinfo.service: Scheduled restart job, restart
counter is at 5.
Jan 05 16:04:17 bo-stationary systemd[1]: Stopped Service running system info LCD.
Jan 05 16:04:17 bo-stationary systemd[1]: lcdsysinfo.service: Start request repeated too
quickly.
Jan 05 16:04:17 bo-stationary systemd[1]: lcdsysinfo.service: Failed with result 'exit-
code'.
Jan 05 16:04:17 bo-stationary systemd[1]: Failed to start Service running system info LCD.
Если я cat файл журнала в / var / log / lcdsysinfo.log , я получаю
/usr/bin/python2: can't open file '/etc/opt/lcdsysinfo.py': [Errno 13] Permission denied
Traceback (most recent call last):
File "/etc/opt/lcdsysinfo.py", line 170, in <module> runCycle()
File "/etc/opt/lcdsysinfo.py", line 121, in runCycle
time.sleep(sleepIntervalSecs)
KeyboardInterrupt
Что я делаю не так?
Мне кажется, что это что-то делать с переводом l oop в спящий режим, но у меня есть некоторые вычисления, которые делаются со временем, поэтому я бы действительно использовал python l oop и сохранял статистику в памяти, чем считывал и сохранял в файлы сохранить состояние и вызвать скрипт в стиле cron.