通過python 執行 nohup 不生效的解決

2022-09-27 08:27:10 字數 3708 閱讀 2925

通過paramiko模組ssh登入linux,然後用exec_command方法執行帶有nohup的shell命令不生效,python指令碼如下:

import paramiko

import time

ssh = paramiko.sshclient()

ssh.set_miss程式設計客棧ing_host_key_policy(paramiko.autoaddpolicy())

ssh.connect('192.168.1.2', 22, 'root', '123456')

ssh.exec_co程式設計客棧mmand('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='***')

# 執行命令

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.www.cppcns.com0.3', port=22, username='***', 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()

四、類的呼叫實現:

簡單測試,見下www.cppcns.com面**

# -*- 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":,

"""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"登入伺服器---成功:")

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"退出伺服器---成功")

if __name__ == '__main__':

test_host = ,]}

}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 ;")

logger.info(f"伺服器---執行---cd ;---成功")

time.sleep(2)

else:

logger.info(f"伺服器---暫時沒有任務")

easy_conn.quit()

本文標題: 通過python 執行 nohup 不生效的解決

本文位址:

nohup 執行mysql命令 nohup命令

在應用unix linux時,我們一般想讓某個程式在後台執行,於是我們將常會用 在程式結尾來讓程式自動執行。比如我們要執行mysql在後台 usr local mysql bin mysqld safe user mysql 可是有很多程式並不想mysqld一樣,這樣我們就需要nohup命令,怎樣使...

nohup 後台執行

1 nohup命令 nohup 命令 log 會將本應在螢幕上顯示的輸出,重定向到同級目錄的 out中,即後台執行並把stdout輸出到檔案nohup.out中,可以使用 來重定向輸出。2 例子 3 應用環境 一般都是在linux下 4 nohup是否有匹配的 nohup command line或...

Linux下通過nohup和後台執行程式

後台執行 結合兩者 nohup命令 如果你正在執行乙個程序,而且你需要在退出帳戶時該程序還不會結束,那麼可以使用nohup命令。該命令可以在你退出帳戶 關閉終端之後繼續執行相應的程序。nohup 是no hang up的縮寫,就是不結束通話的意思。nohup 命令執行由 command引數和任何相關...