通过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 相关文章推荐
Python实现读取文件最后n行的方法
Feb 23 Python
Python实现决策树C4.5算法的示例
May 30 Python
从DataFrame中提取出Series或DataFrame对象的方法
Nov 10 Python
Python对ElasticSearch获取数据及操作
Apr 24 Python
Python批量修改图片分辨率的实例代码
Jul 04 Python
Flask框架钩子函数功能与用法分析
Aug 02 Python
python ffmpeg任意提取视频帧的方法
Feb 21 Python
Windows下Anaconda安装、换源与更新的方法
Apr 17 Python
Python类及获取对象属性方法解析
Jun 15 Python
关于Python3的import问题(pycharm可以运行命令行import错误)
Nov 18 Python
numba提升python运行速度的实例方法
Jan 25 Python
Python实现简单的猜单词
Jun 15 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中常见的mongodb查询操作
2013/06/20 PHP
(PHP实现)只使用++运算实现加法,减法,乘法,除法
2013/06/27 PHP
提高php编程效率技巧
2015/08/13 PHP
Laravel学习教程之从入口到输出过程详解
2017/08/27 PHP
php生成微信红包数组的方法
2019/09/05 PHP
面向对象的编程思想在javascript中的运用上部
2009/11/20 Javascript
JavaScript实现的石头剪刀布游戏源码分享
2014/08/22 Javascript
jQuery使用之处理页面元素用法实例
2015/01/19 Javascript
元素绑定click点击事件方法
2015/06/08 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
python插入排序算法的实现代码
2013/11/21 Python
Python MySQLdb模块连接操作mysql数据库实例
2015/04/08 Python
Python冒泡排序注意要点实例详解
2016/09/09 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
2016/09/18 Python
Python编程之微信推送模板消息功能示例
2017/08/21 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
Python queue队列原理与应用案例分析
2019/09/27 Python
基于python的列表list和集合set操作
2019/11/24 Python
在keras中获取某一层上的feature map实例
2020/01/24 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
Python更换pip源方法过程解析
2020/05/19 Python
css3.0 图形构成实例练习二
2013/03/19 HTML / CSS
JPA的优势都有哪些
2013/07/04 面试题
高中军训广播稿
2014/01/14 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
学校清明节活动总结
2014/07/04 职场文书
2014优秀大学生简历自我评价
2014/09/15 职场文书
民主生活会批评与自我批评总结
2014/10/17 职场文书
有限公司股东合作协议书
2014/10/29 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技