介绍
小编这次要给大家分享的是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不生效怎么办