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

问题描述 投票:1回答:1

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

[当我使用ssh登录到服务器并运行该脚本,然后终止ssh会话时,Python脚本也会按预期终止(我未使用nohup,&等)。但是,当我运行使用Fabric使用相同的脚本,然后终止本地Fabric进程,则systemd将获取服务器上的python进程。这是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

是否有类似于ssh的行为来防止systemd获取子进程的方法?为什么只在使用Fabric而不是直接使用ssh时才收获?

更多详细信息:

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

flask_app = Flask('app')

@flask.route('/')
def index():
  # ....

if __name__ == '__main__':
  flask_app.run(host='0.0.0.0')

Fabric脚本大致如下:

server_conn = fabric.Connection('1.2.3.4')
with server_conn.cd('/root/peacock'):
  server_conn.run('/root/peacock/bin/python3 -m src.main')
python linux ssh systemd fabric
1个回答
0
投票

如果需要在远程服务器上将进程作为守护程序运行,建议您将其设置为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

访问日志
© www.soinside.com 2019 - 2024. All rights reserved.