Python 如何启动与paramiko的后台工作?

Python 如何启动与paramiko的后台工作?,python,screen,paramiko,nohup,Python,Screen,Paramiko,Nohup,下面是我的场景:我正在尝试使用Paramiko自动化一些任务。任务需要按照以下顺序启动(使用符号(host,task)):(A,1),(B,2),(C,2),(A,3),(B,3)——基本上是按照正确的顺序启动服务器和客户端进行一些测试。此外,因为在测试中,网络可能会混乱,而且因为我需要测试的一些输出,所以我只想将输出重定向到一个文件 在类似的场景中,常见的响应是使用“screen-m-d”或使用“nohup”。然而,使用paramiko的exec_cmd,nohup实际上并没有退出。使用: b

下面是我的场景:我正在尝试使用Paramiko自动化一些任务。任务需要按照以下顺序启动(使用符号(host,task)):(A,1),(B,2),(C,2),(A,3),(B,3)——基本上是按照正确的顺序启动服务器和客户端进行一些测试。此外,因为在测试中,网络可能会混乱,而且因为我需要测试的一些输出,所以我只想将输出重定向到一个文件

在类似的场景中,常见的响应是使用“screen-m-d”或使用“nohup”。然而,使用paramiko的exec_cmd,nohup实际上并没有退出。使用:

bash -c -l nohup test_cmd & 
也不起作用,exec_cmd仍然阻止进程结束

在屏幕情况下,输出重定向工作得不太好(事实上,在我能理解的最佳情况下根本不起作用)

所以,在所有这些解释之后,我的问题是:有没有一种简单优雅的方法来分离进程并捕获输出,从而结束paramiko的exec_cmd阻塞

更新


dtach命令可以很好地实现这一点

我对paramiko和它的exec_cmd一无所知,但也许
bash
disown
会有所帮助

#!/bin/bash -l
test_cmd &
disown test_cmd

为此,我编写了一个小型shell脚本,在远程端执行:

#!/bin/bash

# check for command line arguments
if [ $# -lt 2 ]; then
        echo "usage: runcommand.sh EXECUTIONSTRING TASKNAME"
        exit -1
fi

taskname=$2
execstr=$1
logfile=$taskname.log

echo START $taskname > $logfile
echo OWNPID $BASHPID >> $logfile
stime=`date -u +"%Y-%m-%d_%H-%M-%S"`
stimes=`date -u +"%s"`
echo STARTTIME $stime >> $logfile
echo STARTTIMES $stimes >> $logfile
# execute program
$execstr 1>$taskname.stdout 2>$taskname.stderr 
echo RETVAL $? >> $logfile

stime=`date -u +"%Y-%m-%d_%H-%m-%S"`
stimes=`date -u +"%s"`
echo STOPTIME $stime >> $logfile
echo STOPTIMES $stimes >> $logfile
echo STOP $taskname >> $logfile
它的作用:执行一个给定的任务,将stdout、stderr的输出传输到两个不同的文件,并创建一个日志文件,该日志文件保存任务开始时、完成时以及任务的返回值

然后,我首先将脚本复制到远程主机,并使用exec_命令在那里执行它:

command = './runcommand.sh "{execpath}" "{taskname}" > /dev/null 2>&1 &'
ssh.exec_command(command.format(execpath=anexecpath, taskname=ataskname)

不使用nohup或screen

def command(channel, cmd):
    channel.exec_command(cmd + ' > /dev/null 2>&1 &')
这表示“将STDOUT从cmd重定向到dev/null,然后将STDERR重定向回STDOUT,后者进入/dev/null。然后将其推送到后台。”


exec_命令不会挂起任何输出(不会出现),因此它会返回。

+1最好在远程端编写脚本。