通过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 random模块用法解析及简单示例
Dec 18 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 Python
python格式化输出保留2位小数的实现方法
Jul 02 Python
python try except返回异常的信息字符串代码实例
Aug 15 Python
python输入错误后删除的方法
Oct 12 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 Python
浅谈python的elementtree模块处理中文注意事项
Mar 06 Python
对python中list的五种查找方法说明
Jul 13 Python
Python实现扫码工具的示例代码
Oct 09 Python
python中操作文件的模块的方法总结
Feb 04 Python
python实现简单聊天功能
Jul 07 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实现的一个简单json rpc框架实例
2015/03/30 PHP
如何使用纯PHP实现定时器任务(Timer)
2015/07/31 PHP
Sample script that deletes a SQL Server database
2007/06/16 Javascript
csdn 论坛技术区平均给分功能
2009/11/07 Javascript
浅析Node.js查找字符串功能
2014/09/03 Javascript
jQuery中toggleClass()方法用法实例
2015/01/05 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
jQuery实现淡入淡出二级下拉导航菜单的方法
2015/08/28 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
自己封装的一个原生JS拖动方法(推荐)
2016/11/22 Javascript
AngularJS基于ngInfiniteScroll实现下拉滚动加载的方法
2016/12/14 Javascript
bootstrap日期控件问题(双日期、清空等问题解决)
2017/04/19 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
详解Vue单元测试case写法
2018/05/24 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
详解VUE中的插值( Interpolation)语法
2020/10/18 Javascript
Python基于PycURL实现POST的方法
2015/07/25 Python
给你选择Python语言实现机器学习算法的三大理由
2017/11/15 Python
python取代netcat过程分析
2018/02/10 Python
python计算两个地址之间的距离方法
2018/06/09 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
2019/07/10 Python
Python sqlalchemy时间戳及密码管理实现代码详解
2020/08/01 Python
美国精品家居用品网站:US-Mattress
2016/08/24 全球购物
家庭户外服装:Hawkshead
2017/11/02 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
小区门卫值班制度
2014/01/24 职场文书
干部下基层实施方案
2014/03/14 职场文书
期末评语大全
2014/05/04 职场文书
优秀少先队员主要事迹材料
2014/05/28 职场文书
员工培训协议书
2014/09/15 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
西安事变观后感
2015/06/12 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书