通过python 执行 nohup 不生效的解决


Posted in Python onApril 16, 2020

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

import paramiko
import time
 
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.2', 22, 'root', '123456')
ssh.exec_command('nohup ping localhost & \n')
time.sleep(1)

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

import paramiko
import time
 
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.1.2', 22, 'root', '123456')
chan = ssh.invoke_shell()
chan.send('nohup ping localhost & \n')
time.sleep(1)

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

补充知识:paramiko远程服务器nohup阻塞问题

一、需求描述:

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

二、问题描述:

import paramiko
 
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.0.3', port=22, username='xxx')
# 执行命令
stdin, stdout, stderr = ssh.exec_command('cd ~/ ; nohup python3.6 run_test.py > nohup_test.log 2>&1 &')
# 获取命令结果
result = stdout.read()
# 关闭连接
ssh.close()

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

三、解决方法

import paramiko
 
# 创建SSH对象
ssh = paramiko.SSHClient()
# 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接服务器
ssh.connect(hostname='192.168.0.3', port=22, username='xxx', key=private_key)
# 添加下面代码
transport = ssh.get_transport()
channel = transport.open_session()
# 执行命令 此方法没有返回值
channel.exec_command('cd ~/ ; nohup python3.6 run_test.py > nohup_test.log 2>&1 &')
 
# 关闭连接
ssh.close()

四、类的调用实现:

简单测试,见下面代码

# -*- coding: utf-8 -*-
"""
20190330
"""
 
import paramiko
import time
from confs.log import logger # 自行导入logging模块即可
 
 
class EasyConnectHandle(object):
  """操作远程服务器"""
 
  def __init__(self, connect_host_name:dict):
    """初始化参数"""
    """
      "test":{
        "ip":"192.168.0.189",
        "user_name":"xxxx",
        "pwd":"huhuhu"
      },
    """
    self.connect_host = connect_host_name
    self.ssh = paramiko.SSHClient()
    self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 允许连接陌生服务器
    self.ssh.connect(hostname=self.connect_host["ip"], port=22, username=self.connect_host["user_name"],
             password=self.connect_host["pwd"], timeout=10) # 初始化的时候连接到新的服务器
    logger.info(f"登录服务器---{self.connect_host['ip']}成功:")
 
  def __new__(cls, *args, **kwargs):
    """单例模式"""
    if not hasattr(cls, '_instance'):
      cls._instance = super(EasyConnectHandle, cls).__new__(cls)
    return cls._instance
 
  def exec(self, cmd=""):
    """执行操作"""
    stdin, stdout, stderr = self.ssh.exec_command(cmd)
    return stdout.read().decode()
 
  def quit(self):
    """断开服务器"""
    self.ssh.close()
    logger.info(f"退出服务器---{self.connect_host['ip']}成功")
 
if __name__ == '__main__':
  test_host = {
    "test": {
        "ip": "192.168.0.111",
        "user_name": "xxxx",
        "pwd": "xxxx",
        "jobs": [
          {
            "path": "/home/lemon",
            "type": "touch test_1.sh"
          },
          {
            "path": "/home/lemon",
            "type": "touch test_2.sh"
          }
        ]
      }
    }
  for i in ["test"]:
    easy_conn = EasyConnectHandle(test_host[i])
    transport = easy_conn.ssh.get_transport()
    if len(test_host[i].get("jobs", [])) >= 1:
      for job in test_host[i]["jobs"]:
        channel = transport.open_session()
        channel.exec_command(f"cd {job['path']};{job['type']}")
        logger.info(f"服务器---{easy_conn.connect_host['ip']}执行---cd {job['path']};{job['type']}---成功")
        time.sleep(2)
    else:
      logger.info(f"服务器---{easy_conn.connect_host['ip']}暂时没有任务")
    easy_conn.quit()

以上这篇通过python 执行 nohup 不生效的解决就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
python 实现return返回多个值
Nov 19 Python
numpy:np.newaxis 实现将行向量转换成列向量
Nov 30 Python
python 导入数据及作图的实现
Dec 03 Python
Python数据可视化:顶级绘图库plotly详解
Dec 07 Python
python程序输出无内容的解决方式
Apr 09 Python
keras:model.compile损失函数的用法
Jul 01 Python
Python实现FTP文件定时自动下载的步骤
Dec 19 Python
python 批量将中文名转换为拼音
Feb 07 Python
【超详细】八大排序算法的各项比较以及各自特点
Mar 31 Python
Python学习之迭代器详解
Apr 01 Python
在python中使用nohup命令说明
Apr 16 #Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
Apr 16 #Python
python实现程序重启和系统重启方式
Apr 16 #Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 #Python
jupyter notebook 重装教程
Apr 16 #Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 #Python
Python实现Word表格转成Excel表格的示例代码
Apr 16 #Python
You might like
php stream_get_meta_data返回值
2013/09/29 PHP
php文件下载处理方法分析
2015/04/22 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
php ajax实现文件上传进度条
2016/03/29 PHP
thinkPHP中钩子的使用方法实例分析
2017/11/16 PHP
laravel-admin的多级联动方法
2019/09/30 PHP
ExtJS 2.2.1的grid控件在ie6中的显示问题
2009/05/04 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
瀑布流布局并自动加载实现代码
2013/03/12 Javascript
JS.getTextContent(element,preformatted)使用介绍
2013/09/21 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
window.close(); 关闭浏览器窗口js代码的总结介绍
2016/07/14 Javascript
js编写的treeview使用方法
2016/11/11 Javascript
Bootstrap的基本应用要点浅析
2016/12/19 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
js面向对象编程总结
2017/02/16 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
Vue触发式全局组件构建的方法
2018/11/28 Javascript
python双向链表实现实例代码
2013/11/21 Python
Python中的闭包总结
2014/09/18 Python
Python实现列表转换成字典数据结构的方法
2016/03/11 Python
sublime text 3配置使用python操作方法
2017/06/11 Python
python编写分类决策树的代码
2017/12/21 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
python爬虫之遍历单个域名
2019/11/20 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
小学生自我鉴定
2013/10/12 职场文书
心理学专业求职信
2014/06/16 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
信访工作个人总结
2015/03/03 职场文书
python字符串常规操作大全
2021/05/02 Python
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python