如何使用/ paramiko启动后台作业?

时间:2010-02-04 18:39:41

标签: python screen paramiko nohup

这是我的场景:我正在尝试使用Paramiko自动执行某些任务。任务需要按此顺序启动(使用符号(主机,任务)):( 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命令很适合这个!

3 个答案:

答案 0 :(得分:4)

不使用nohup或屏幕。

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

这说“将STDOUT从cmd重定向到dev / null,然后将STDERR重定向回STDOUT,进入/ dev / null。然后将其推入后台。”

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

答案 1 :(得分: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

它的作用:执行给定任务,将stdout,stderr的输出通过管道传输到两个不同的文件,并创建一个日志文件,该日志文件在任务启动时,完成时以及任务的返回值时保存。

然后我首先将脚本复制到远程主机并使用exec_command执行它:

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

答案 2 :(得分:-1)

我对paramiko一无所知,而且它是exec_cmd,但也许bash的{​​{1}}可以提供帮助。

disown