- ベストアンサー
psとgrepでのプロセス監視での失敗事例
- プロセス監視での失敗事例について
- Cシェルを使用して行うプロセス監視での問題
- 発生頻度が低いが、プロセスが正常に起動しているにも関わらずエラーが出力される場合がある
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 Cシェルは、名前のとおりC言語に似せた文法で、C言語経験者になじみやすいという特徴をもっている、、、はずが、シェルスクリプトというもともとC言語的発想がなじまない分野に強引に当てはめようとしたためかなり無理があり、むしろ非常にわかりづらいものとなっています。Bourneシェルスクリプトではきれいに簡単に書けるような処理がCシェルで記述すると繁雑になり美しくないことが多いです。 標準出力と標準エラー出力を別個にリダイレクトできないなど不便な点も多いです。 なので、そもそもCシェルでスクリプトを書く人自体少ないため、メンテナンス上もよろしくありません。 /bin/csh がかならずシステム上に存在するという保証もありません。(/bin/shはかならずあります) ログインシェルcshやtcshとして使う人は少なからずいますが、昔ながらの/bin/shよりコマンドラインが使いやすいというだけです。今はbash,ksh,zshなど、Bourne系でも強力なものがたくさんありますから、ログインシェルとしてのcshも廃れていくと思われます。 さて、出力を/dev/nullに捨てていますが、出力をファイルに落としておくように一時的に変更してしばらく様子を見て、次にエラーになった時にそのファイルの中身を見て原因を分析してはどうでしょうか。 ひとまずこの質問は閉じて、何か月後かわかりませんが、またエラーになった時に解決できなければ、上記の出力内容を添えて再度質問されてはどうでしょうか。
その他の回答 (3)
- 1percent
- ベストアンサー率55% (10/18)
回答ではないのですが、 始めのシェル変数の代入ですが”SET”は大文字で記述されているのでしょうか? 私も試してみましたが大文字ですとシェル変数への代入が行われずps~条件式の部分が機能しないみたいなのですが。
補足
説明に記載した"SET"は現在実行している 監視スクリプトには"set"と小文字で書かれてました。 掲載時のミスです。申し訳ないです。
>if ( ${status} != 0 ) then ${status}の部分はなんでしょうか? また、$PRC_NAME に入るプロセスの間に空白(ps -ax)があるとうまく取れないもしくは余計なものまで取ってしまうのではないでしょうか? このような方法ではどうでしょうか? PRC_ACCOUNT = プロセスを実行したユーザ名 PRC_NAME = 監視するプロセス名 ps -axuww | awk '($1 == "${PRC_ACCOUNT}"){print $0}' | grep "${PRC_NAME}" if [ $? != 0 ];then echo "ERROR:プロセスが見つかりません" fi
補足
Cシェルの場合コマンドの実行結果が 変数 $status に入るので、使用しております。
- shige_70
- ベストアンサー率17% (168/946)
Cシェルでスクリプトを書くのはいろんな意味で良くないです。 それが原因である可能性はほとんどないと思いますが。。。ためしにBourneシェルで書き直してみる価値もあるでしょう。 あとは、監視方法を変えること。 psとgrepの組み合わせ以外で良く使われる方法は、起動時にpidをファイルに書き出しておき、監視プロセスではそのpidの存在を調べるようにする、という方法です。 また、最近はpgrep,pkillというコマンドもありますので調べてみてください。
補足
Cシェルだと良くない理由と言うのはどのようなことなのでしょうか。 質問内容が違いますが教えてください。 宜しくお願い致します。
お礼
そうですね、一度クローズして情報がもう少し取得できたら再投稿いたします。 実は9ヶ月くらい前からテスト環境では全ログ出力バージョンを動作しているのですが、未だにテスト環境では発生しないのです。 本番環境では2月と10月に発生しているのに・・・ Cシェルの件ご親切にありがとう御座いました。