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