Запустите зацикленный python скрипт в Ubuntu как сервис - PullRequest
1 голос
/ 05 января 2020

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.

...