2010-02-04 43 views
5

这是我的场景:我试图使用Paramiko自动执行一些任务。 (A,1),(B,2),(C,2),(A,3),(B,3) - - 实质上以正确的顺序启动服务器和客户端进行一些测试。此外,因为在测试中,网络可能会被破坏,并且因为我需要测试的一些输出,所以我只想将输出重定向到一个文件。如何启动后台作业w/paramiko?

在类似的情况下,常见的反应是使用'screen -m -d'或使用'nohup'。然而,在paramiko的exec_cmd中,nohup实际上不会退出。使用:

bash -c -l nohup test_cmd & 

也无法工作,exec_cmd仍然阻止处理结束。

在屏幕的情况下,输出重定向不能很好地工作,(实际上,我根本找不到最好的工作)。

因此,在所有的解释之后,我的问题是:是否有一种简单优雅的方式来分离进程并捕获输出,以结束paramiko的exec_cmd阻塞?

更新

的dtach命令作品很好地为这个!

回答

-1

我不知道任何关于paramiko和它的exec_cmd,但也许bashdisown可以帮助。

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

为此我写了我在远程端执行一个小的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 

做些什么:执行给定的任务,管道标准输出的输出,错误输出到两个不同的文件并创建一个日志文件,该文件保存任务何时开始,何时完成以及任务的返回值。

然后,我首先是脚本复制到远程主机,并与exec_command有执行:

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

+1它是一个好主意,可以在远程端编写脚本。 – sbartell

3

不使用的nohup或屏幕。

def command(channel, cmd): 
    channel.exec_command(cmd + ' > /dev/null 2>&1 &') 

这个说 “将stdout从cmd进入开发/空,然后重定向STDERR回STDOUT,它进入的/ dev/null的。然后将其推入背景。”

exec_command不会挂断任何输出(即不会到来),因此它会返回。

+0

试过了,没有为我工作 – chutsu