Systemd

在 systemd 中,python 腳本無法在螢幕中啟動。沒有錯誤

  • February 20, 2021

我寫了一個我想在螢幕內啟動的python腳本

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

這在命令行中工作得很好,但是當我嘗試在 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

系統化:

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

隨著每一次變化。

一個 systemd 單元Type=simple預計不會分叉到後台,而是在後台screen -d -m創建一個新的分離會話並退出。這會導致 systemd 將單元視為已死,並且要麼終止分離的會話,要麼失去對它的跟踪。改用-D -m

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

手冊頁螢幕(1)中解釋了這兩個選項之間的區別:

-d -m 以“分離”模式啟動螢幕。這會創建一個新會話,但不會附加到它。這對於系統啟動腳本很有用。

-D -m 這也會以“分離”模式啟動螢幕,但不會派生新程序。如果會話終止,則命令退出。

如果您的 systemd 單元中沒有包含例如螢幕會話,則螢幕會話以 root 身份執行User=kermit,您需要使用sudo screen -ls來查看會話。

引用自:https://unix.stackexchange.com/questions/635525