python 脚本无法在 systemd 的屏幕中启动。没有错误

python 脚本无法在 systemd 的屏幕中启动。没有错误

我写了一个 python 脚本,我想在屏幕内启动它

screen -d -m /usr/bin/python3 /home/kermit/active-climateMngr.py

它在命令行上运行得很好,但是当我尝试在 systemd 中将其作为服务启动时,不会启动任何屏幕会话。

.服务配置:

[Unit]
Description=Test Service
After=multi-user.target
[email protected]

[Service]
Type=simple
ExecStart=/usr/bin/screen -d -m /usr/bin/python3 /home/kermit/active-climateMngr.py
StandardInput=tty-force

[Install]
WantedBy=multi-user.target

系统:

kermit@minnow:~ $ sudo service active-climateMngr.py status
● active-climateMngr.py.service - Test Service
   Loaded: loaded (/lib/systemd/system/active-climateMngr.py.service; enabled; vendor preset: enabled)
   Active: inactive (dead) since Sat 2021-02-20 08:58:46 CST; 4min 7s ago
  Process: 14373 ExecStart=/usr/bin/screen -d -m /usr/bin/python3 /home/kermit/active-climateMngr.py (code=exited, status=0/SUCCESS)
 Main PID: 14373 (code=exited, status=0/SUCCESS)

Feb 20 08:58:46 minnow.coinz.com systemd[1]: Started Test Service.
Feb 20 08:58:46 minnow.coinz.com systemd[1]: active-climateMngr.py.service: Succeeded.

屏幕:

kermit@minnow:~ $ screen -ls
No Sockets found in /run/screen/S-kermit.

如何让 systemd 在屏幕会话中启动自定义 pythons 脚本?

以前我能够让脚本在没有 systemd 屏幕的情况下工作,但现在也不再有效。

我在用

sudo systemctl daemon-reload

每一次改变。

答案1

预计systemd 单元Type=simple不会分叉到后台,而是screen -d -m在后台创建一个新的分离会话并退出。这会导致 systemd 认为该单元已死亡,并杀死分离的会话或失去对它的跟踪。改用-D -m

Type=simple
ExecStart=/usr/bin/screen -D -m …

这两个选项之间的区别在联机帮助页中进行了解释屏幕(1):

-d-m 以“分离”模式启动屏幕。这会创建一个新会话,但不会附加到它。这对于系统启动脚本很有用。
-D-m 这也会以“分离”模式启动屏幕,但不会分叉新进程。如果会话终止,该命令将退出。

由于屏幕会话以 root 身份运行,如果您未User=kermit在 systemd 单元中包含例如,则需要使用 来sudo screen -ls查看会话。

相关内容