8

这是我的场景:我正在尝试使用 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 命令很好地解决了这个问题!

4

3 回答 3

4

without using nohup or screen.

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

this says "Redirect STDOUT from cmd into dev/null, then redirect STDERR back into STDOUT, which goes into /dev/null. Then push it into the background."

exec_command wont get hung up on any output (thats not coming), thus it'll return.

于 2011-11-15T20:48:56.617 回答
0

For this purpose I wrote a small shell script which I execute on the remote side:

#!/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

What it does: executes a given task, pipes the output of stdout, stderr to two different files and creates a logfile which saves when the task was started, when it finished and the return value of the task.

Then I first copy the script to the remote host and execute it there with exec_command:

command = './runcommand.sh "{execpath}" "{taskname}" > /dev/null 2>&1 &'
ssh.exec_command(command.format(execpath=anexecpath, taskname=ataskname)
于 2011-07-14T10:25:04.620 回答
0

我对 paramiko 一无所知,它是 exec_cmd,但也许bash'sdisown可以提供帮助。

#!/bin/bash -l
test_cmd &
disown test_cmd
于 2010-02-04T19:32:57.637 回答