启动服务的正确“类型”

启动服务的正确“类型”

我有一个通过 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

Systemd 联机帮助页

相关内容