我在 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
访问日志