我有一个通过 python 脚本运行的 LCD 面板,面板接收按键输入,因此脚本始终在监听。我正在尝试创建一个启动服务,该服务将在机器启动后立即运行脚本。
从我读到的内容来看,Type=simple
这是最适合它的,但它不会运行脚本。不过Type=oneshot
有了RemainAfterExit=true
作品。有什么想法吗?
这是lcd-panel.service;
[Unit]
Description=LCD Panel
[Service]
Type=oneshot
RemainAfterExit=true
User=root
WorkingDirectory=/path
ExecStart=/path/start-lcd-panel.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=lcd-panel
[Install]
#WantedBy=multi-user.target
这是将运行 python 脚本的 start-lcd-panel.sh bash 脚本
#!/bin/bash
Application=LCD-Panel
cd /path
if ! [ -e "/path2_exist" ] ; then
#run lcd panel
sudo /path/run-menu.py lcd &
fi
if (( $(pgrep -f -c 'run-menu.py lcd') >= 1 )); then
echo "Started LCD display"
fi
答案1
太长了;我认为这可以归结为:对于一项simple
服务,您希望您的进程位于前台,并处于阻塞状态。这就是提供给ExecStart
背景
如果我阅读联机帮助页,我会发现这些对我来说很突出:
简单:你的the service manager consider the unit started immediately after the main service process has been forked off
不是It is expected that process configured with ExecStart= is the main of the service
,因为它执行run-meny.py
.我对简单的解释是你希望你的进程位于前台,阻塞。
oneshot:the manager will consider the unit up after the main exits
在您的情况下,start-lcd-panel.sh
是您的主进程,它将在分叉后退出run-menu.py
(该行末尾有一个&符号)。我不确定分叉run-menu.py
将如何解释,或者即使子进程(run-menu.py
)将与主进程一起死亡。
oneshot:Note that if this option is used without RemainAfterExit= the service will never enter "active" unit state, but directly transition from "activating" to "deactivating" or "dead" since no process is configured that shall run continuously
这将解释systemctl status
结果。
手册页也很有趣:Also note it is generally not to use idle or oneshot for long-running services.
**
我的建议:我认为该脚本的使用很肤浅,因为它切换到 /path ,该路径被WorkingDirectory
.您还有User=root
,这意味着sudo
脚本中的 是多余的。不确定echo
最后有什么好处,因为你会看到屏幕没有打开。
相反:ExecStart=/path/run-menu.py lcd
与 一起simple
。