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はまだプロセスの終了をブロックしています。

screen の場合、出力のリダイレクトはうまく機能しません (実際には、私が把握している限りではまったく機能しません)。

以上の説明の後、私の質問は次のとおりです。paramiko の exec_cmd ブロッキングを終了するような方法で、プロセスをデタッチして出力をキャプチャする簡単でエレガントな方法はありますか?

アップデート

これには dtach コマンドがうまく機能します。

4

3 に答える 3

4

nohupやscreenを使用せずに。

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

これは、「STDOUTをcmdからdev / nullにリダイレクトしてから、STDERRをSTDOUTにリダイレクトします。STDOUTは/ dev / nullに移動します。次に、バックグラウンドにプッシュします。」

exec_commandは、どの出力でもハングアップしないため(これは実行されません)、返されます。

于 2011-11-15T20:48:56.617 に答える
0

私はparamikoについて何も知りませんし、それはexec_cmdですが、おそらくbash役立つかもしれませんdisown

#!/bin/bash -l
test_cmd &
disown test_cmd
于 2010-02-04T19:32:57.637 に答える
0

この目的のために、リモート側で実行する小さなシェル スクリプトを作成しました。

#!/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 の出力を 2 つの異なるファイルにパイプし、タスクの開始時、終了時、およびタスクの戻り値を保存するログファイルを作成します。

次に、まずスクリプトをリモート ホストにコピーし、そこで 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 に答える