这是我的场景:我正在尝试使用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命令很适合这个!
答案 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