ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

リモート先でジョブが終わったときの戻り値と標準出力内容がほしいとき

2013-12-10 12:20:01 | トピックス
以前、

リモート先でジョブが終わったかどうかを確認する
http://blog.goo.ne.jp/xmldtp/e/cbbdbadaae9c2c8eea8ed8b2ed3cb0dd

というのを書いた。

ここでは、結局
(1)SSHでバックグランドでジョブ起動
(2)動いているかどうか確認
(3)終了したら、データを取ってくる。
ということだった。

ここで、(1)について考えてみると、
たとえば、192.168.1.180から

  ssh 192.168.1.192 /tmp/xmldtp 1234 &

を起動したとすると、
SSHコマンド実行の返り値は、/tmp/xmldtpを起動したことに対する
返り値であって、このxmldtp内で実行した処理に対する返り値は
わからない。

これらのxmldtp内部の処理の返り値と標準出力を受け取りたいというのが、
今日のお題




■お題
192.168.1.180から

  ssh 192.168.1.192 /tmp/xmldtp 1234 &

を起動すると、192.168.1.192では、以下の/tmp/xmldtp内の
シェルが実行する。

touch "/tmp/job.txt"
/tmp/xmldtp1 > "/tmp/kekka1_.txt"
/tmp/xmldtp2 > "/tmp/kekka2_.txt"
cat "/tmp/kekka1_.txt" "/tmp/kekka2_.txt" > "/tmp/kekka.txt"
rm "/tmp/job.txt" "/tmp/kekka1_.txt" "/tmp/kekka2_.txt"


ここで、/tmp/xmldtp1、/tmp/xmldtp2の2つの処理を行っているが、
この返り値を取得し、それも/tmp/kekka$1.txtに入れて、返してほしい。




■2つの方法

返り値は、$?で取得できる。
このとき、大きく2つの方法が考えられる

(1)戻り値($?)の値もファイルにechoで書き出し、
  標準出力と共に、1つのファイルに書き出した後
  不要な作業ファイルを削除する
   →すべてファイルに書き出す作戦

(2)バッククウォートで実行し、標準出力を変数に入れる
  戻り値($?)の値も、何かの変数に入れる
  これら変数をファイルに書き出す
   →すべて、変数に入れる作戦

これらの中間で、一部ファイル、一部変数に入れる形も考えられる。
が、今回はこの両極端を考える。

以下、スクリプトを記述する




■方法1:すべてファイルに書き出す作戦

こんなかんじ

touch "/tmp/job$1.txt"
/tmp/xmldtp1 > "/tmp/kekka1_$1.txt"
echo $? > "/tmp/kekka3_$1.txt"
/tmp/xmldtp2 > "/tmp/kekka2_$1.txt"
echo $? > "/tmp/kekka4_$1.txt"
cat "/tmp/kekka3_$1.txt" "/tmp/kekka1_$1.txt" "/tmp/kekka4_$1.txt" "/tmp/kekka2_$1.txt" > "/tmp/kekka$1.txt"
rm "/tmp/job$1.txt" "/tmp/kekka1_$1.txt" "/tmp/kekka2_$1.txt""/tmp/kekka3_$1.txt" "/tmp/kekka4_$1.txt"


まあ、説明は要らないだろう




■方法2:すべて変数に入れる作戦

こんなかんじ

touch "/tmp/job$1.txt"
job1out=`/tmp/xmldtp1`
job1ret=$?
job2out=`/tmp/xmldtp2`
job2ret=$?
echo $job1ret $job1out $job2ret $job2out > "/tmp/kekka$1.txt"
rm "/tmp/job$1.txt"

バッククウォートで実行(`/tmp/xmldtp1`)しているので、変数(job1out)
には、標準出力値が入る。
$?も変数にいれ、それらをまとめて書き出している。

はじめに作業ファイルを作るので(起動していることを示すため)
これを削除しているが、標準出力と戻り値に関しては、変数にいれ、
これらをファイル書き出ししていない。




■比較

ファイルを使わないので、削除し忘れの無い、方法2のほうが、
一見良いように見える。
しかし、方法2は変数に入れるため、大量のデータが変数領域に
はいることになる。これが、よいかどうか・・・

が問題になる。変数にいれるのがよろしくないとなると、
方法1になる。

この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« OpenStack Networking | トップ | JMeter2.10の、HTTPプロキシ... »
最新の画像もっと見る

トピックス」カテゴリの最新記事