Python 为什么systemd在使用Fabric而不是ssh运行脚本时会获得子进程?
我正在Ubuntu 18.04.2服务器上通过SSH运行Python脚本 当我使用Python 为什么systemd在使用Fabric而不是ssh运行脚本时会获得子进程?,python,linux,ssh,systemd,fabric,Python,Linux,Ssh,Systemd,Fabric,我正在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/s
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应用程序。其要点是:
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')
如果您需要在remote box上作为守护进程运行进程,我建议您将其设置为systemd单元。通过这种方式,您可以使用标准命令对其进行控制,并像系统上的任何其他服务一样访问其日志 您的配置可能看起来像(
/etc/systemd/system/piock.service
):
记住sudo chmod 644/etc/systemd/system/piockok.service
。然后,您的结构脚本将如下所示:
server_conn = fabric.Connection('1.2.3.4')
with server_conn.cd('/root/peacock'):
server_conn.run('systemctl start peacock.service')
稍后,您可以检查此服务的状态。您还可以使用
journalctl-u piock
什么是src.main
?您能否提供用于连接Fabric的代码以及如何启动该过程?@urban更新了有关脚本和Fabric代码的详细信息。我认为Fabric(如果我记得的话,在内部使用paramiko)将打开一个会话,运行您的命令并终止会话(这应该在您退出上下文管理器时发生)。当会话被拆开时,进程也会死亡,这与ssh的行为相同。我建议你创建一个systemd单元(你自己的服务)——它有10行配置:非常感谢——将它变成systemd单元肯定是更好的方法。然而,我试图确切地理解Fabric/paramiko和普通SSH之间的区别是什么,这导致前者被systemd获取,而不是后者:)@SSharan您说过,当您关闭SSH时,python脚本也会终止,对吗?我认为结构脚本终止时也会发生同样的情况,因为应该在退出时的某个地方调用close()
。。不是100%确定这就是你在问题中的意思
server_conn = fabric.Connection('1.2.3.4')
with server_conn.cd('/root/peacock'):
server_conn.run('systemctl start peacock.service')