通过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中的with语句与上下文管理器学习总结
Jun 28 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
Apr 23 Python
Python数据结构之图的应用示例
May 11 Python
windows下python安装小白入门教程
Sep 18 Python
对python特殊函数 __call__()的使用详解
Jul 02 Python
django使用admin站点上传图片的实例
Jul 28 Python
Python3 读取Word文件方式
Feb 13 Python
python在不同条件下的输入与输出
Feb 13 Python
Python实现分数序列求和
Feb 25 Python
python求numpy中array按列非零元素的平均值案例
Jun 08 Python
Python hashlib和hmac模块使用方法解析
Dec 08 Python
解决pycharm 格式报错tabs和space不一致问题
Feb 26 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
mysql 搜索之简单应用
2007/04/27 PHP
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
php实现图片局部打马赛克的方法
2015/02/11 PHP
php实现网页端验证码功能
2017/07/11 PHP
JavaScript函数、方法、对象代码
2008/10/29 Javascript
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
验证javascript中Object和Function的关系的三段简单代码
2010/06/27 Javascript
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
不用锚点也可以平滑滚动到页面的指定位置实现代码
2013/05/08 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
详解Javascript继承的实现
2016/03/25 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
使用ES6语法重构React代码详解
2017/05/09 Javascript
基于Jquery Ajax type的4种类型(详解)
2017/08/02 jQuery
JS去掉字符串中所有的逗号
2017/10/18 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
vue组件中watch props根据v-if动态判断并挂载DOM的问题
2019/05/12 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
使用Python开发windows GUI程序入门实例
2014/10/23 Python
举例讲解Python中的算数运算符的用法
2015/05/13 Python
python实现的系统实用log类实例
2015/06/30 Python
Python2.7简单连接与操作MySQL的方法
2016/04/27 Python
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
python实现简易内存监控
2018/06/21 Python
Python for循环中的陷阱详解
2018/07/13 Python
CSS3绘制六边形的简单实现
2016/08/25 HTML / CSS
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
护士演讲稿范文
2014/01/05 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
太空授课观后感
2015/06/17 职场文书
个人落户申请书怎么写?
2019/06/28 职场文书