HP-UX General
1824219 メンバー
3983 オンライン
109669 解決策
新規ポスト

コマンド終了ステータスの取得

 
M_Ka
時折のコントリビューター

コマンド終了ステータスの取得

いつもお世話になっております。

以下のようなケースでのコマンドの終了ステータスを取得する方法をご教授ください。

コマンド行>

tar cvf /dev/rmt/0mn /tmp 2>&1 >&- | tee -a tar.log

(状況)

・tarコマンドの標準出力・エラー出力をログファイルと画面に

 出力するためにパイプでteeコマンドに渡しています。

・このコマンド行の次の行で$?の終了ステータスを取得すると

 teeコマンドの終了ステータスが取れてしまいます。

(ご質問)

・tarコマンドが異常終了した場合(終了ステータス0以外)に

 エラー出力はteeに渡して表示した後に、スクリプトを異常終了(exit)させる

 方法はありますでしょうか

説明がわかりづらいかもしれませんが宜しくお願いいたします
3件の返信3
nadachi
レギュラーアドバイザー

コマンド終了ステータスの取得

まず、すいません、テストのため、tarの代わりに、

#include

main(argc, argv)

int argc;

char *argv[];

{

int i;

printf("Hello\n");

i = atoi(argv);

exit(i);

}

を作ります。これをコンパイルして出来たのを"a" と

すると、

$ ./a 0

Hello

$ echo $?

0

$ ./a 1

Hello

$ echo $?

1

となります。exitコードを選べるわけです。で、

スクリプト、

#!/usr/bin/sh

./a 1 | tee -a logfile

echo exit code $?

を実行すると、

Hello

exit code 0

となって、1 にはならない。これを捕まえたいわけですね。

 ちょっと汚いですが、こんな手を思いつきました。

#!/usr/bin/sh

( ./a 1 ; echo "Tar:exit code $?" ) | tee -a logfile

grep 'Tar:exit' logfile

 実行すると、

Hello

Tar:exit code 1 <- これはechoの出力

Tar:exit code 1 <- こっちが grep の出力

となりました。shell 変数に入れたいところですが、とりあえずは logfile に tar の exitコード情報を含めてしまうわけです。後からlogfileでtar の exitコードを調べて、エラーならスクリプトを exitさせる。

 うーん、もっとうまい手があるかも知れませんが、参考まで。
N.Hanyu
貴重なコントリビューター

コマンド終了ステータスの取得

こんにちは。

シェルにしちゃっていいなら。

---

#!/usr/bin/sh

tar cvf /dev/rmt/0mn /tmp 2>&1

echo $?

---

というシェル(test.shとする)を作って、

# sh test.sh | tee tar.log

で両方取れますよ。

どうしても終了コード0が出したくないなら

if文等で分岐させてください。
hazelwood
信頼あるコントリビューター

コマンド終了ステータスの取得

別解です。

多分、バックアップ時間はこちらの方が短いと思います。(特にコンソールで実行した場合。)

#場合によっては最後の出力が一部スキップされるかもしれませんが。

----------

tar cvf /dev/rmt/0mn /tmp >>tar.log 2>&1 &

tail -f tar.log &

wait %1

RV=$? ; echo "Tar exit by $RV"

kill %2

tail tar.log

-----------