通过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 获取 Linux 系统信息的代码
Jul 13 Python
深入理解Python 代码优化详解
Oct 27 Python
朴素贝叶斯算法的python实现方法
Nov 18 Python
Python使用defaultdict读取文件各列的方法
May 11 Python
基于hashlib模块--加密(详解)
Jun 21 Python
用Python删除本地目录下某一时间点之前创建的所有文件的实例
Dec 14 Python
python实现快速排序的示例(二分法思想)
Mar 12 Python
python使用Flask操作mysql实现登录功能
May 14 Python
python使用selenium实现批量文件下载
Mar 11 Python
Python IDE Pycharm中的快捷键列表用法
Aug 08 Python
Python可变参数会自动填充前面的默认同名参数实例
Nov 18 Python
详细介绍python操作RabbitMq
Apr 12 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
单位速度在实战中的运用
2020/03/04 星际争霸
php学习之运算符相关概念
2011/06/09 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
php中get_magic_quotes_gpc()函数说明
2017/02/06 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
jQuery 技巧小结
2010/04/02 Javascript
jquery如何把参数列严格转换成数组实现思路
2013/04/01 Javascript
js 日期比较相关天数代码
2014/04/02 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
JavaScript使用encodeURI()和decodeURI()获取字符串值的方法
2015/08/04 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
微信小程序 欢迎界面开发的实例详解
2016/11/30 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
js实现鼠标拖拽多选功能示例
2017/08/01 Javascript
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
python求列表交集的方法汇总
2014/11/10 Python
Python计算三角函数之asin()方法的使用
2015/05/15 Python
python 换位密码算法的实例详解
2017/07/19 Python
python远程邮件控制电脑升级版
2019/05/23 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
Django应用程序入口WSGIHandler源码解析
2019/08/05 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
2020/03/09 Python
python中tkinter窗口位置\坐标\大小等实现示例
2020/07/09 Python
如何使用PyCharm引入需要使用的包的方法
2020/09/22 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
实习教师自我鉴定
2013/09/27 职场文书
成品仓管员岗位职责
2013/12/11 职场文书
国际贸易专业自荐信
2014/06/10 职场文书
单位活动策划方案
2014/08/17 职场文书
关于读书的演讲稿400字
2014/08/27 职场文书
大学生个人学习总结
2015/02/15 职场文书
党小组评议意见
2015/06/02 职场文书
美容院管理规章制度
2015/08/05 职场文书
基于Python实现对比Exce的工具
2022/04/07 Python