Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么systemd在使用Fabric而不是ssh运行脚本时会获得子进程?_Python_Linux_Ssh_Systemd_Fabric - Fatal编程技术网

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

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

我正在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应用程序。其要点是:

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')