在ubuntu中作为服务运行循环python脚本

2024-09-30 00:33:47 发布

您现在位置:Python中文网/ 问答频道 /正文

简称: 我有一个python脚本,我想作为服务安装它。但是,当作为服务运行时,它会终止,而当作为根用户手动运行时,它不会终止

全部: 我有一个物理HD44780 LCD显示器连接到一个显示各种诊断的服务器。 数据由python脚本收集,该脚本需要使用python2运行并具有root权限。 该脚本本质上是一个收集信息、计算某些值并写入LCD的循环。此后,它会重新进入睡眠状态5秒钟,然后再次进入睡眠状态

我希望将其作为服务运行,并遵循本教程: Run python script at startup with Systemd service

我的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

我做错了什么

在我看来,这与使循环进入睡眠状态有关,但我有一些随着时间的推移而完成的计算,因此我真的会使用python循环并将统计信息保存在内存中,而不是读取并保存到文件以保持状态,并以类似cron的方式调用脚本


Tags: py脚本loglcd状态serviceetcsystem

热门问题