• ベストアンサー

シェルでの強制終了

通常で実行すると永遠と実行結果を出力するコマンドを、シェル内部にて実行して 内容をログに吐き出したいのですが停止方法がわかりません。 (ctrl+cと同じ事をシェル内部でやりたい。) #!/bin/sh prstat -t | awk '{print $2, $5}' > prstat.log 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • elflend
  • ベストアンサー率64% (58/90)
回答No.2

sleep XX -> kill はこの場合無効だと思われます。 (prstat -t だけだと永久ループのコマンドの為) この場合は prstat -t ではなく prstat -t 1 300 としましょう。 意味合いとしては -t の出力結果を1秒毎更新、300回繰り返し という意味です。 但しこの場合 prstat.log には300回実行分のログが残ります。 補足ですが prstat -t 300 1 とした場合 300秒毎に1回更新せよという意味になりますが はじめの1回は一瞬で返ってくるので、これを1回とカウントしてしまうようです。 300秒後にもう1度実行させたい場合は prstat -t 300 2 とするが吉です。 但しこの場合もログには2回分の結果がのこります。

hidesbizar
質問者

お礼

ありがとうございます。 引数で回数が指定できたんでね。。。 すみません確認不足でした。

その他の回答 (2)

  • elflend
  • ベストアンサー率64% (58/90)
回答No.3

#2 です。 > sleep XX -> kill はこの場合無効だと思われます。 すみません、 & が入っていたのを見落としました。 強制終了がかかった時にエラーログが吐かれるようですが kill でも正常に動作します。

  • maku_x
  • ベストアンサー率44% (164/371)
回答No.1

適当な時間、例えば5分後に止めたい場合、 #!/bin/sh (prstat -t | awk '{print $2, $5}') > prstat.log & sleep 300 kill %1 の様に書けばいけるのではないかと思います。

関連するQ&A

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

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

  • Bシェルのawkコマンドについて

    Bシェルのawkコマンドについてですが、例えばプロンプトから % ls -l hoge.txt | awk '{print $5}' と入力すると、hoge.txtのファイルサイズが出力されますが、同様のことをBシェルの中で行おうと思っています。 下記のように、配列arrayにはスペース区切りで3つのデータが入っており、N番目のデータを取得したいという場合に、Nに変数を使用して取得する方法がわかりません。 #!/bin/sh array="AA BB CC" num=3 # CCを取得したい echo $array | awk '{print $num}' 上記で実行すると、"AA BB CC"のようにすべて出力されてしまいます。awkで出力する箇所を${数値}で指定すればうまくいくのですが、ランダムで決めた数値(1~3)をnumに入れて取得したい場合、このようなことは可能でしょうか。 もし不可能な場合でも、awk以外に何かコマンドがあればご教授願います。なお、作成するのはBシェルになります。

  • シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのです

    シェルスクリプトで、空白(スペース)を含む変数をawkに渡したいのですが、どうしたらいいでしょうか? 例えば、以下のようなtest.shというファイルを作ったとします。 --------------- #!/bin/sh AAA="x y" echo "" | awk '{print $AAA}' -------------- としたとき、$AAAが正常に出力できません。(なお、echo "" は、awkを走らせる為の単なるダミーです。) printの部分を ・awk '{print '$AAA'}' ・awk '{print "'$AAA'"}' などともしてみましたが、ダメでした。どのようにすればうまくいくでしょうか?

  • 【シェル】whileコマンドについて

    【シェル】whileコマンドについて OS:Solaris10 SH:Bシェル お世話になります。 whileコマンドにてテキストから、先頭に"#"(シャープ)が付いている行と、 空白行以外を読み込ませたいです。 ところが、メイン処理にawkコマンドを入れると、テキストを読む時点で、 行全体ではなく、指定したフィールド内の文字列を読みにいくため、 "#"(シャープ)が付いている行を無視することができません。 ====== while.sh ====== #!/bin/sh while read LINE do echo $LINE | awk '{print $2}' done < list.txt | grep -v "^#" | grep -v "^$" ====================== ------ list.txt ------ 1 2 3 #4 5 6 7 8 9 ---------------------- ****** 出力結果 ****** 2 5 8 ********************** ** 出力させたい結果 ** 2 8 ********************** whileコマンドのオプション等で、テキスト内に特定の記号がある行は 無視して読み込ませる方法がありましたら、ご教授ください。 宜しくお願い致します。

  • Cシェルについて

    Cシェルについて #! /bin/csh ##! /bin/csh -vx setenv NOHUP '/usr/bin/nohup' set AAA_CSH = $NOHUP' XXX.sh file.txt &' ($AAA_CSH >> /dev/null) >>& err.log シェルスクリプトを作成して上記のとおりnohupでXXX.shを実行するように記述します。 エラーがあった場合、err.logに出力するように作成したつもりなのですが、 XXX.shがなかったとき、 「/usr/bin/nohup: XXX.sh:そのようなファイルまたはディレクトリはありません。」 と標準出力されてしまいます。 このエラーメッセージをerr.logに記述するようにしたいのですが、 どうしたらよいでしょうか? よろしくお願いいたします。

  • Kシェルのリダイレクト

    Kシェルのリダイレクト シェル初心者で申し訳ございませんが、ご教授いただけたら幸いです。 やりたいこと  xxx.kshの実行ログを出力したい。 出力したいログは、以下コマンド実行時に標準出力されるログをファイルへ落としたい。 尚、実際の実行コマンドは、ksh -xは入力しません。 $ ksh -x ./xxx.ksh 上記コマンドを実行すると、詳細なログが表示されるのですが、ファイルへ落としたいと思います。 分かりづらいかも知れませんが、宜しくお願い致します。

  • [シェルスクリプト内で bashコマンド後のコマンドが実行されない]

    [シェルスクリプト内で bashコマンド後のコマンドが実行されない] 以下の様にシェルスクリプトを記述するとコマンド2が実行されません。 #! /bin/sh コマンド1 bash コマンド2 bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?

  • クーロンでシェル実行、JAVAコマンドが動かない・・

    クーロンにて、シェルを自動起動し、JAVAコマンドを動かそうとしています。 cron → abc.sh実行 └def.sh実行 └JAVAコマンド実行 という位置付けです。 まず、 0 3 * * * sh /usr/src/sh/abc.sh という設定にてクーロンを自動実行しようとしました。abc.shの内容はこうです。 #!bin/sh /bin/sh /usr/src/sh/def.sh> /log/def.txt def.txtというテキストは生成されるのですが、def.shが実行されていません。。 def.shの中身はjavaコマンドで、 java aaa.bbb.ccc.ddd/conf/repair.properties というものです。 また、念のため、クーロンに直接 0 3 * * * /bin/sh /usr/src/sh/def.sh ともやってみましたが、結果は同じでした。 どうすればdef.shがちゃんと実行されるでしょうか? そもそもjavaコマンドをクーロンですることはできないのでしょうか?

  • シェルの引数チェックについて

    HP-UNIX シェルで指定された引数の桁数のチェックや入力値のチェックを 行いたいと思っております。 自分なりに調べた所、awkコマンドを使用して、lengthや正規表現 でチェックできそうなのですが、シェルで指定された引数をどの ようにしてチェックすればよいのかがわかりません。 例)aaa.sh 引数1 引数2   ⇒aaa.shの中で、$@等で上記のチェックを行う???  イメージとしては、   ・if (length($1) == 10) ・$1!~/[a-zA-Z0-9]/  でも、aaa.shの中で、awkの使用方法がわかりません。 awkを使用する以上、ls -l | awk ~~~ のように、 一度、引数をファイルに出力してから、grepとパイプ機能を使用 する?しか方法はないでしょうか。 (実行環境で、パーミッションの設定でシェルを実行できない 為、上記の方法を試すには到っていません・・・パーミッションについて も、まだ理解が乏しい為。) シェルスクリプトを触り出して、まだ間もない事もあり、可能な のかどうかも判断できない状況ですが、ご存知の方がいらっしゃ いましたら、ご教授頂ければと思います。  

  • awkコマンドに引数を渡す方法

    awkコマンドに対して引数を渡す方法が知りたいです。 例えば以下のようなリストファイルがあったとします。 --------------------------------------- % cat test.lst 454 100 37536 200 32432 300 34q2 400 --------------------------------------- そこで以下のシェルを実行すると --------------------------------------- #!/bin/sh for VAL in 100 200 300 do CNT=`cat test.lst | awk '$2 == $VAL {print $1}'` echo "$VAL : $CNT" done --------------------------------------- awkコマンド内の$VALが引数ではなく文字列として認識されてしまうため、 出力結果が 100 : 200 : 300 : となってしまいます。 100 : 454 200 : 37536 300 : 32432 という結果を出力したい場合(awk内の引数を有効にする場合)どうすればよいでしょうか? awkを使用しない方法もあるかと思いますが、今回はawkを使った方法を知りたいです。 宜しくお願い致します。