我写了一个 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
查看会话。