为什么 systemd 在使用 Fabric 而不是 ssh 运行脚本时会收获子进程?



我在 Ubuntu 18.04.2 服务器上通过 SSH 运行 Python 脚本。

当我使用ssh登录到服务器并运行脚本,然后终止 ssh 会话时,Python 脚本也会按预期终止(我没有使用 nohup 等(。但是,当我使用 Fabric 运行相同的脚本,然后终止本地 Fabric 进程时,服务器上的 python 进程会被 systemd 获取。这是 systemd 状态的样子:

● session-219.scope - Session 219 of user root
Loaded: loaded (/run/systemd/transient/session-219.scope; transient)
Transient: yes
Active: active (abandoned) since Fri 2019-12-27 00:56:07 PST; 2min 55s ago
Tasks: 1
CGroup: /user.slice/user-0.slice/session-219.scope
└─6872 /root/peacock/bin/python3 -m src.main
Dec 27 00:56:07 master systemd[1]: Started Session 219 of user root.
Dec 27 00:57:52 master sshd[6783]: pam_unix(sshd:session): session closed for user root

有没有办法防止systemd收获子进程,类似于ssh的行为?为什么它只在使用 Fabric 时才会被收获,而不是直接使用 ssh?

更多详情:

Python 脚本是一个简单的烧瓶应用程序。它的要点是:

flask_app = Flask('app')
@flask.route('/')
def index():
# ....
if __name__ == '__main__':
flask_app.run(host='0.0.0.0')

结构脚本大致如下:

server_conn = fabric.Connection('1.2.3.4')
with server_conn.cd('/root/peacock'):
server_conn.run('/root/peacock/bin/python3 -m src.main')

如果您需要在远程盒子上将进程作为守护进程运行,我建议您将其设置为systemd单元。通过这种方式,您可以使用标准命令控制它,并像系统上的任何其他服务一样访问其日志。

您的配置可能如下所示 (/etc/systemd/system/peacock.service(:

[Unit]
Description=Peacock systemd service.
[Service]
Type=simple
ExecStart=/root/peacock/bin/python3 -m src.main
[Install]
WantedBy=multi-user.target

记得sudo chmod 644 /etc/systemd/system/peacock.service.然后,您的结构脚本将如下所示:

server_conn = fabric.Connection('1.2.3.4')
with server_conn.cd('/root/peacock'):
server_conn.run('systemctl start peacock.service')

稍后,您可以检查此服务的状态。您还可以使用journalctl -u peacock访问日志

最新更新