• 締切済み

シェルスクリプトでのエラー時の処理について

HTMLにシェルスクリプトを実行するSSIを埋め込んで、 その実行結果をHTML側に出力する、という処理をしようとしております。 大まかな処理内容は、指定の場所のファイルの有無をチェックして それにより"ok"か"ng"かの文字列をHTMLに出力する、というものです。 ====以下、HTMLソース(前後省略)==== <br> 結果は:<!--#exec cmd="./output.sh" --> <br> ====ここまで==== ====以下、シェルスクリプトソース==== #!/bin/sh CHECKFILE=/aaa/bbb/check.txt TEXTA=ok TEXTB=ng if [ -f $CHECKFILE ] ; then echo $TEXTA else echo $TEXTB fi exit ====ここまで==== この処理自体は特に問題無さそうなのですが、 この中に途中で異常終了した際のエラー処理を組み込むことによって、 異常時には固定で"ok"を出力して終了するようにしたいのです。 trap "echo 'ok'; exit" HUP INT QUIT KILL TERM や trap "echo 'ok'; exit" 1 2 3 9 15 などのtrapを入れたりもしたのですが、 思い通りには動かず、結果を返すことなく終了してしまいます。 このような場合、trapに限らず何か良い方法はありますでしょうか。 何かご存知の方おりましたらご助言頂けますでしょうか。。 よろしくお願いいたします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4852/10266)
回答No.1

想定されている異常時とはどんなものでしょうか? trap コマンドは外部からシグナルを受けたときの動作を指定するものです。もしかして、シェルスクリプト内で起動したコマンドの異常終了を検知したいのであれば、都度 $? を調べる必要があります。

kotkot31
質問者

補足

お返事どうもありがとうございます。 おっしゃる通り、外部シグナルでなくスクリプト内の異常終了を検知したかったのです。 $?というものを知りませんでしたので、とりあえず使い方を調べさせて頂いて、後ほど結果を報告したいと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • シェルスクリプト trap処理につきまして

    シェルスクリプトを作成しておりますが、 正常に動作しないので、ご教授いただけますでしょうか。 以下、作成したスクリプトを記載いたします。 #!/bin/sh trap "echo 'stopped'" 1 2 3 15 echo start sleep 10 echo end 上記のようなスクリプトを作成し、trap処理のテストを 行いたいのですが、上記スクリプト実行中で 「Ctrl+C」を押して、処理を止めても trap処理の「stopped」が表示されません。 スクリプトが処理が終わり、 コマンド入力できるようになったところで、「Ctrl+C」を押すと 「stopped」が表示されます。 スクリプト内で処理を止めた場合に「stopped」を表示させることが出来ず、困っております。 どなたかご教授いただけますでしょうか。 宜しくお願い致します。

  • シェルスクリプト trap処理の流れにつきまして

    シェルスクリプト作成しておりますが、 trap処理について質問がありますので、ご教授お願い致します。 以下、テストしたいと思っているスクリプトを記載いたします。 #!/bin/sh trap "echo 'stopped'" 1 2 3 15 echo start > test1.txt sleep 100 echo end > test1.txt 上記スクリプトを実行し、Ctrl+cもしくは、 kill -15 でスクリプトを削除した場合、 sleep中にスクリプト中断していると思うのですが、 end文字列がtest1.txtに書き込まれてしまいます。 trapが処理される流れというのは、どのような流れなのでしょうか。 また途中で中断しているのであれば、途中で以下処理を 行なわないようにするにはどうすればよろしいでしょうか。 宜しくお願いいたします。

  • 簡単なシェルスクリプトを見てください。

    次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか?

  • linuxのシェルスクリプト

    linuxのシェルスクリプト シェルスクリプトの質問をどこですればよいのかよくわからないので、ここでさせていただきます。 最近、始めてシェルスクリプトの勉強を始めました。 スクリプトに渡す引数を出力したいと思い、 echo $1 echo $2 echo $3 とかくと、スクリプトに渡した引数が出力されます。 これを、for文で書くと for i in 1 2 3 do echo $i done とねるのですが、これでは1,2,3が出力されてしまいます。 どうなおしたらいいのでしょうか? よろしくお願いいたします。

  • Bシェルでパイプ→exitがうまくいかない

    Bシェルで、下記のようにパイプの中でexitすることでスクリプトを終了させようとしたのですが、パイプした処理を抜けるだけexit 1 のところでスクリプトが終了せず、whileループの後のexit 0のところまで行ってスクリプトが終了しました。 パイプの中でexitすると、パイプの外に出るだけになるのでしょうか? どうすれば、パイプの中でスクリプトを終了させることができるのでしょうか? #! /bin/sh cat /tmp/tmp.dat | while read LINE do LL=LINE exit 1 done echo $LINE exit 0 また、これとは別に、変数LLに$LINEを代入して、その後LLをechoすると、$LINEの内容が出ると思ったら、中が空になっているようで何も出力されませんでした。 これを回避して、LLにLINEの内容を保存するような処理をしたいのですが、どうすればいいでしょうか? 以上、よろしくお願いします。

  • シェルスクリプトで困っています 2

    度々申し訳ございません。 現在、Linuxマシン1からLinuxマシン2へTelnetでログインし、Linuxマシン2上にあるシェルスクリプト(/bin/sh)を実行し、Linuxマシン2上のプログラムを実行した後、Linuxマシン2からログアウトするシェルスクリプトを作成中です。 その、Linuxマシン2からログアウトする際に、 "exit"を記述しているのですが、その"exit"がTelnetログアウトの意味で実行されず、シェルスクリプトを終了するの意味で実行されていて困っています。 どなたか上手くTelnetからログアウトできるようにシェルスクリプトを組む方法をご存知ではないでしょうか?もし判りましたらご教授下さい。 よろしくお願い致します。

  • シェルスクリプトでエラー時にリトライ方法

    下記のようなシェルスクリプトを作成したいと思っています。 apacheのアクセスログを確認し、 (1)httpステータスが200なら後続の処理を実行 (2)200以外ならエラーを表示させ、  200以外なら5回リトライして5回ともhttpステータス"200"が一度も返ってこなければ(grepに含まれていなければ)スクリプトを中止するような処理を行いたいです。 初心者でループ処理?リトライ処理?というのがよくわかっていなくて… 下記のようなスクリプトにどう手を加えたらいいかご教授いただけますでしょうか。 #!/bin/sh cd /XXX/apache/log if tail -n 5 access_$DATE.log grep "|200|" >/dev/null; then tail -n 5 access_$DATE.log grep "|200|" echo "httpステータスは200です" else echo "httpステータスは200以外です" exit fi : よろしくお願いします

  • Linux シェルの trap について

    お世話になります。 シェルについて、どなたかご教授頂けますと幸いで御座います。 以下、★処理を実施していますが、シェル.sh を実行中に Ctrl+\ で終了(シグナル)しても トラップ処理が実行されません。"| tee -a ファイル名" を削除し、シェル.sh のみ実行すると、 トラップ処理が実行されます。何か、良いアイデアは御座いますか?? ******************************************************* #!/bin/bash #------------------------------------------------------------------------------ # Trap #------------------------------------------------------------------------------ trap 'echo "trapped."; トラップ処理 >> /dev/null 2>&1;exit 1' 1 3 15 trap '' 2 umask 022 : <中略> : #------------------------------------------------------------------------------ # main #------------------------------------------------------------------------------ シェル.sh | tee -a ファイル名 ★ #シェル.sh *******************************************************

  • シェルスクリプト 引数の引渡しについて

    こんにちは。現在シェルスクリプトを勉強中なのですがどうしてもわからないことがあり投稿させていただきました。 シェルスクリプトにて作成した引数(引数にスペースがある場合)を別のシェルスクリプトへ渡そうとしたときにうまく引き渡せなくて困っています。 詳しくは以下のスクリプト参照願います。 (1)引数作成のスクリプト _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh a="HELLO" b="\"WOW WOW\"" test.sh $a $b _/_/_/_/_/_/_/_/_/_/_/_/ (2)test.sh _/_/_/_/_/_/_/_/_/_/_/_/ #!/bin/sh echo $1 echo $2 echo $3 _/_/_/_/_/_/_/_/_/_/_/_/ これを実行すると $1=HELLO $2="WOW $3=WOW" となってしまいます。 これを $1=HELLO $2=WOW WOW $3=NULL(空欄) となるようにシェルスクリプトで作成することはできないのでしょうか? ご教授よろしくお願いします。 よろしくお願いします。

  • シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕

    シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。 -------------------------------------------------- #!/bin/sh . GetYesNo.sh          #外部シェルスクリプトを読み込んで... GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。 if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。 echo "真(0)です。" else echo "偽(0以外)です。" fi -------------------------------------------------- 戻り値が0か1しか出力しない外部シェルスクリプトを読み込んで、その戻り値をtestコマンドを利用して、0か1のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。 色々な方法を試してみましたが、ダメでした。 上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。