系统自动化-通过服务启动时运行Python脚本

时间:2020-01-23 20:29:12

标签: linux bash raspberry-pi raspbian systemd

我整理了一个用Python编写的自动温度检查脚本,该脚本会在检测到给定范围之外的值时通知我,目的是在无头Raspberry Pi上运行它。在研究如何执行此操作时,很快就发现最普遍建议的方法是使用Systemd。不幸的是,我无法重新创建一天中大部分时间都在学习的教程,因此决定是时候寻求帮助了。

我不确定在此提供什么信息,因为Python脚本本身可以很好地工作。就是说,这就是我在尝试创建服务时得到的结果:

[Unit]
Description=Temp Check Script
After=network.target

[Service]
ExecStart=/usr/bin/python3 -u TempCheck.py
WorkingDirectory=/home/pi/TempCheck
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

这是我检查状态时收到的错误:

(code=exited, status=1/FAILURE)
Start request repeated too quickly.
Failed with result "exit-code"
Failed to start Temp Check Script

我尽了最大的努力提出一些关键问题,以更好地理解每件事的真正含义,但这是使用bash / systemd的第一天,因此,如果您想知道为什么我确实做了一个特殊的事情,答案肯定是无知,或者是因为一个教程告诉我。说到这一点,这是该服务基于-> https://www.raspberrypi.org/documentation/linux/usage/systemd.md

的一项

非常感谢您的帮助,我真的很感谢!

编辑:

运行时:

journalctl -u TempCheck.service

我收到了一些新东西,包括:

python3[404]: /usr/bin/python3 can't open file 'main.py': [Erno 2] No such file or directory
systemd[1]: TempCheck.service: Main process exited, code=exited, status=2/INVALIDARGUMENT
systemd[1]: TempCheck.service: Failed with result 'exit-code'/
systemd[1]: TempCheck.service: Service RestartSec=100ms expired, scheduling restart.
systemd[1]: TempCheck.service: Scheduled restart job, restart counter is at 1.
systemd[1]: TempCheck.service: Stopped Temp Check Script
systemd[1]: TempCheck.service: Started Temp Check Script

这重复了几次。

我觉得应该澄清一下,此后我一直在继续阅读教程等,并将服务修改为以下内容:

[Unit]
Description=Temp Check Script
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/python /home/pi/TempCheck/TempCheck.py
User=pi
WorkingDirectory=/home/pi/TempCheck
StartLimitIntervalSec=10
Restart=on-failure

[Install]
WantedBy=multi-user.target

我相信,新提供的扩展错误消息来自该服务

编辑2:

我意识到我正在关注的其中一个教程要求我包括:

#!usr/bin/python3

在我的脚本顶部。此后,我将其删除。现在,我看到脚本应该正在运行,但是我没有收到任何表明它正在执行应做操作的通知(再次,很奇怪,因为在IDE中运行以及直接从命令行运行时,它完全可以运行) 。但是,再次检查,我们又回到了失败状态,这次出现了初始错误:

(code=exited, status=1/FAILURE)
Start request repeated too quickly.
Failed with result "exit-code"
Failed to start Temp Check Script

编辑3:在尝试使用crontab时,我也没有成功。不知道为什么会这样,因为它基本上与我直接从命令行调用时做的事情相同,并且在使用CLI时工作正常。这对我说脚本没有错,很有可能systemd或crontab并没有错,但是systemd / crontab与脚本之间发生了一些奇怪的事情。我已经对我提供的目录进行了两次和三次检查,它们是正确的。我在这里完全没有主意。

解决方案:不要尝试在脚本中使用环境变量,只需直接声明它们即可。尽管我将继续寻找引用环境变量的方法,但这是我所拥有的最好的方法。建议非常感谢。

1 个答案:

答案 0 :(得分:0)

您应指定两次服务重启之间的间隔。您可以通过设置伪指令StartLimitIntervalSec=来实现。 设置此设置后,不要忘记用以下命令重新加载服务守护进程:

systemctl daemon-reload