python执行nohup不生效怎么办

  介绍

小编这次要给大家分享的是python执行nohup不生效怎么办,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。

通过paramiko模块ssh登录linux,然后用exec_command方法执行带有nohup的壳命令不生效,python脚本如下:

进口paramiko
  导入的时间
  
  ssh=paramiko.SSHClient ()
  ssh.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
  ssh.connect(& # 39; 192.168.1.2& # 39;, 22日& # 39;根# 39;,& # 39;123456 & # 39;)
  ssh.exec_command (& # 39; nohup ping本地主机,\ n # 39;)
  time . sleep (1) 

脚本执行完之后平进程并没有继续运行,这可能是因为exec_command执行完之后立刻关闭通道的原因,换用invoke_shell可以正常运行:

进口paramiko
  导入的时间
  
  ssh=paramiko.SSHClient ()
  ssh.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
  ssh.connect(& # 39; 192.168.1.2& # 39;, 22日& # 39;根# 39;,& # 39;123456 & # 39;)
  陈=ssh.invoke_shell ()
  chan.send (& # 39; nohup ping本地主机,\ n # 39;)
  time . sleep (1) 

注意,命令最后的回车\ n和延时必不可少

<强> paramiko远程服务器nohup阻塞问题

<强>一、需求描述:

需要来回切换多台服务器(脚本命令不太熟),就用了python的paramiko模块进行远程连接服务器、控制程序的停止和启动。安装:pip安装paramiko

<强>二,问题描述:

进口paramiko
  
  #创建SSH对象
  ssh=paramiko.SSHClient ()
  #允许连接不在know_hosts文件中的主机
  ssh.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
  #连接服务器
  ssh.connect(主机名=& # 39;192.168.0.3& # 39;,端口=22日用户名=& # 39;xxx # 39;)
  #执行命令
  stdin、stdout stderr=ssh.exec_command (& # 39; cd ~/;nohup python3.6 run_test。py祝辞nohup_test。日志2祝辞,1,& # 39;)
  #获取命令结果
  结果=stdout.read ()
  # 关闭连接
  ssh.close () 

这样连接服务器的时候确实可以执行,但是遇到会阻塞的任务时,就无法生效,找了很多方法,最后发现这个比较有效。

<强>三,解决方法

进口paramiko
  
  #创建SSH对象
  ssh=paramiko.SSHClient ()
  #允许连接不在know_hosts文件中的主机
  ssh.set_missing_host_key_policy (paramiko.AutoAddPolicy ())
  #连接服务器
  ssh.connect(主机名=& # 39;192.168.0.3& # 39;,端口=22日用户名=& # 39;xxx # 39;,关键=private_key)
  #添加下面代码
  运输=ssh.get_transport ()
  频道=transport.open_session ()
  #执行命令此方法没有返回值
  channel.exec_command (& # 39; cd ~/;nohup python3.6 run_test。py祝辞nohup_test。日志2祝辞,1,& # 39;)
  
  # 关闭连接
  ssh.close () 

<强>四、类的调用实现:

简单测试,见下面代码

 # - * -编码:utf - 8 - *
  “““
  20190330
  “““
  
  进口paramiko
  导入的时间
  从之。导入日志记录器#自行导入日志模块即可
  
  
  类EasyConnectHandle(对象):
  “““操作远程服务器“,“
  
  def __init__(自我connect_host_name: dict类型):
  “““初始化参数“““
  “““
  “test": {
  “ip":“192.168.0.189"
  “user_name":“xxxx"
  “pwd":“huhuhu"
  },
  “““
  自我。connect_host=connect_host_name
  自我。ssh=paramiko.SSHClient ()
  self.ssh.set_missing_host_key_policy (paramiko.AutoAddPolicy()) #允许连接陌生服务器
  self.ssh.connect(主机名=self.connect_host (“ip")端口=22日用户名=self.connect_host (“user_name"),
  密码=self.connect_host (“pwd"),超时=10)#初始化的时候连接到新的服务器
  logger.info (f"登录服务器- - - {self.connect_host [& # 39; ip # 39;]}成功:“)
  
  def __new__ (cls * args, * * kwargs):
  “““单例模式“““
  如果不是hasattr (cls & # 39; _instance& # 39;):
  cls。_instance=超级(EasyConnectHandle cls) . __new__ (cls)
  返回cls._instance
  
  def exec(自我,cmd=?”):
  “““执行操作“““
  stdin、stdout stderr=self.ssh.exec_command (cmd)
  返回stdout.read () .decode ()
  
  def辞职(自我):
  “““断开服务器“,“
  self.ssh.close ()
  logger.info (f"退出服务器- - - {self.connect_host [& # 39; ip # 39;]}成功“)
  
  if __name__==& # 39; __main__ # 39;:
  test_host={
  “test": {
  “ip":“192.168.0.111"
  “user_name":“xxxx"
  “pwd":“xxxx"
  “jobs":(
  {
  “path":“/home/lemon"
  “type":“碰test_1.sh"
  },
  {
  “path":“/home/lemon"
  “type":“碰test_2.sh"
  }
  ]
  }
  }
  因为我在(“test"):
  easy_conn=EasyConnectHandle (test_host[我])
  运输=easy_conn.ssh.get_transport ()
  如果len (test_host[我]. get (“jobs",[]))在=1:
  工作在test_host[我](“jobs"):
  频道=transport.open_session ()
  channel.exec_command (f" cd{工作[& # 39;path & # 39;]},{工作[& # 39;类型# 39;]}“)
  logger.info (f"服务器- - - {easy_conn.connect_host [& # 39; ip # 39;]}执行——cd{工作[& # 39;path & # 39;]},{工作[& # 39;类型# 39;]}- - -成功“)
  time . sleep (2)
  其他:
  logger.info (f"服务器- - - {easy_conn.connect_host [& # 39; ip # 39;]}暂时没有任务“)
  easy_conn.quit () 

python执行nohup不生效怎么办