
始めまして。
miko_zzと申します。
現在運用中のサーバでプロセス監視をCシェルで
下記コマンドの結果により行っております。
このコマンドの結果は通常では正常に監視出来ているのですが、
極まれにプロセスは正常に起動中でもエラーを出力してしまいます。
発生条件が判明できないため発生したら目視で確認することで運用を
しているのですが、原因が知りたいのでご助力お願い致します。
ちなみに発生頻度は 年に3回くらいで非定期的です。
------------------------------------------------------------------
SET PRC_ACCOUNT = プロセスを実行したユーザ名
SET PRC_NAME = 監視するプロセス名
ps axuww | egrep ^$PRC_ACCOUNT | grep $PRC_NAME >& /dev/null
if ( ${status} != 0 ) then
echo "ERROR:プロセスが見つかりません" ;
endif
------------------------------------------------------------------
No.4ベストアンサー
- 回答日時:
#1です。
Cシェルは、名前のとおりC言語に似せた文法で、C言語経験者になじみやすいという特徴をもっている、、、はずが、シェルスクリプトというもともとC言語的発想がなじまない分野に強引に当てはめようとしたためかなり無理があり、むしろ非常にわかりづらいものとなっています。Bourneシェルスクリプトではきれいに簡単に書けるような処理がCシェルで記述すると繁雑になり美しくないことが多いです。
標準出力と標準エラー出力を別個にリダイレクトできないなど不便な点も多いです。
なので、そもそもCシェルでスクリプトを書く人自体少ないため、メンテナンス上もよろしくありません。
/bin/csh がかならずシステム上に存在するという保証もありません。(/bin/shはかならずあります)
ログインシェルcshやtcshとして使う人は少なからずいますが、昔ながらの/bin/shよりコマンドラインが使いやすいというだけです。今はbash,ksh,zshなど、Bourne系でも強力なものがたくさんありますから、ログインシェルとしてのcshも廃れていくと思われます。
さて、出力を/dev/nullに捨てていますが、出力をファイルに落としておくように一時的に変更してしばらく様子を見て、次にエラーになった時にそのファイルの中身を見て原因を分析してはどうでしょうか。
ひとまずこの質問は閉じて、何か月後かわかりませんが、またエラーになった時に解決できなければ、上記の出力内容を添えて再度質問されてはどうでしょうか。
そうですね、一度クローズして情報がもう少し取得できたら再投稿いたします。
実は9ヶ月くらい前からテスト環境では全ログ出力バージョンを動作しているのですが、未だにテスト環境では発生しないのです。
本番環境では2月と10月に発生しているのに・・・
Cシェルの件ご親切にありがとう御座いました。
No.3
- 回答日時:
回答ではないのですが、
始めのシェル変数の代入ですが”SET”は大文字で記述されているのでしょうか?
私も試してみましたが大文字ですとシェル変数への代入が行われずps~条件式の部分が機能しないみたいなのですが。
この回答への補足
説明に記載した"SET"は現在実行している
監視スクリプトには"set"と小文字で書かれてました。
掲載時のミスです。申し訳ないです。
No.2
- 回答日時:
>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
No.1
- 回答日時:
Cシェルでスクリプトを書くのはいろんな意味で良くないです。
それが原因である可能性はほとんどないと思いますが。。。ためしにBourneシェルで書き直してみる価値もあるでしょう。
あとは、監視方法を変えること。
psとgrepの組み合わせ以外で良く使われる方法は、起動時にpidをファイルに書き出しておき、監視プロセスではそのpidの存在を調べるようにする、という方法です。
また、最近はpgrep,pkillというコマンドもありますので調べてみてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VirtualBox 6.1 → 7.1 でUbuntu...
-
LinuxでWine使うとどのくらいWi...
-
Core 2 Duo の古いパソコンに最...
-
「トゥ]の出し方
-
WinSCPでLinux(CentOS6.10)に...
-
2TBのUSBメモリを2000円ほどで...
-
zorin OS
-
私のパソコンでVirtualBoxは使...
-
Linuxでブートディスクの交換後...
-
linuxのIMEの件
-
windows10を使っています。 wsl...
-
bashでシングルクォート内の変...
-
インストールできないですどう...
-
raspberrypi に bluealsaを入れ...
-
ubuntu 22日本語Remixのisoイメ...
-
LinuxのPCは基本不要PC中古を使...
-
Ububtuでファイル共有できない...
-
ubuntu(linux)のシャットダウン...
-
Lubuntuでとにかく軽量のバージ...
-
ubuntu 24 へのCanon 複合機ス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
LinuxでWine使うとどのくらいWi...
-
Core 2 Duo の古いパソコンに最...
-
インストールできないですどう...
-
ubuntu(linux)のシャットダウン...
-
Linuxでブートディスクの交換後...
-
bashでシングルクォート内の変...
-
WinSCPでLinux(CentOS6.10)に...
-
ubuntuのシャットダウンが進ま...
-
Linux のシェルスクリプトの強...
-
CentOSが起動時にフリーズ
-
ubuntuで デイスク/deb/loopと...
-
Ubuntu on Xorgのログインについて
-
「トゥ]の出し方
-
Windowsのローカルディレクトリ...
-
apacheでリバースプロキシを設...
-
ubuntu 24 へのCanon 複合機ス...
-
ログにserver reached MaxReque...
-
WineのRufusでデバイスを検知す...
-
ssl_request_logの必要性について
-
「/var/log」内のログの削除の...
おすすめ情報