通過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引數和任何相關...