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

bra*_*rad 4 python systemd services python3

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

screen -d -m /usr/bin/python3 /home/kermit/active-climateMngr.py
Run Code Online (Sandbox Code Playgroud)

它在命令行上工作得很好,但是当我尝试在 systemd 作为服务启动它时,没有任何屏幕会话启动。

.服务配置:

[Unit]
Description=Test Service
After=multi-user.target
Conflicts=getty@tty1.service

[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
Run Code Online (Sandbox Code Playgroud)

系统:

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.
Run Code Online (Sandbox Code Playgroud)

屏幕:

kermit@minnow:~ $ screen -ls
No Sockets found in /run/screen/S-kermit.
Run Code Online (Sandbox Code Playgroud)

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

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

我在用

sudo systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

随着每一个变化。

cg9*_*909 5

Type=simple预计systemd 单元不会进入后台,而是在后台screen -d -m创建一个新的分离会话并退出。这会导致 systemd 认为该单元已死亡,并且要么终止分离的会话,要么失去对它的跟踪。使用-D -m来代替:

Type=simple
ExecStart=/usr/bin/screen -D -m …
Run Code Online (Sandbox Code Playgroud)

手册页screen(1) 中解释了这两个选项之间的区别:

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

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