• ベストアンサー

シェルスクリプトの正規表現

こんばんは。 CentOSでサービスを再起動しようと思ったのですが、資料に書いてある 通りにスクリプトを作っても動きません(起動はできるけど 再起動、停止ができない)。 仕方がないのでプロセスをkillしたあとスクリプトを起動して再起動 する方法を取ろうとしていますが、最後の1歩で詰まりました。 echoでps -axをした結果を変数に入れて先頭の数字(PID)だけを 切り出そうとするのですが、プロセスIDが、空白+PID4桁の時と 空白なしPID5桁のときとあるので上手くHitさせることが出来ません。 mofu=`ps -ax|grep qmail-send` 4桁) mohe=`expr "$mofu" : \(^\s[0-9]*\)'` 5桁) mohe=`expr "$mofu" : \([0-9]*\)'` kill $mohe /etc/rc.d/init.d/qmail シェルスクリプトで自動化したいので、PIDの桁数に関係なく確実に killしたいです。 上手い方法があったら御教授下さい。 よろしくお願いします。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

qmailはよくわからないのですがkillallは使えないのでしょうか? また、/var/runなどにpidは保存されないのでしょうか?

sollalice
質問者

お礼

ありがとうございます。 /var/runを見てみましたが、qmailのpidはありませんでした。 killall qmail-sendでプロセスを終了させることが出来ました。 早速シェルスクリプトに組み込んだところ、期待した動作になりました。 ありがとうございました。 またお願いします。

その他の回答 (3)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

exprを使おうと思うのは珍しいですね。 まず、expr の正規表現では\sは使えません。空白文字すべてでなく空白だけでいいなら、空白を書けばいいです。'\( [0-9]*\)' ただ、空白がいくつあっても無くてもマッチする '\( *[0-9]*\)' を使った方がいいでしょう。これだとプロセスIDが何桁でもOKです。 あと、ps -ax|grep qmail-send だと、qmail-sendプロセス以外にgrepコマンド自身にもマッチする可能性があるので、 ps -ax|grep '[q]mail-send' などとすると、grep にはマッチしません。 まとめると、 mofu=`ps -ax|grep '[q]mail-send'` mohe=`expr "$mofu" : '\( *[0-9]*\)'` それはそれとして、/etc/rc.d/init.d/qmail restart ではうまく行かないと言うことですか?

sollalice
質問者

お礼

ありがとうございます。 自分の環境に入っていた/etc/rc.d/init.d/qmail を見てみたところ、 スタート処理しか書かれていませんでした。 自前でrestartを書いてみたところ、やはり上手く行きませんでした。 ありがとうございました。 またお願いします。

  • cubic_
  • ベストアンサー率0% (0/2)
回答No.3

4/5桁両方対応だと \s?[0-9]{4,5} でOKなはずです。 4桁のみなら \s[0-9]{4} 5桁のみなら [0-9]{5} でいけると思います。 正規表現しか知識がないので1行ずつ読み込んでいるのか そうでないのかすらわからないのですが、 一行ずつ読み込んでいる処理の場合は 上記の正規表現に文頭を示す「^」を入れるとよいです。 うまくHitしないのは[0-9]の次の*かもしれません。 いくらあっても、もしくはなくてもいいよってことなので。 *(0回以上いくらでも)を+(1回以上いくらでも)に変えれば 改善されるかもしれません。 もしそれでも改善されない場合、正規表現の記法の問題ではなく その他の点に問題がある可能性を考えてみてください。

sollalice
質問者

補足

ありがとうございます。 自分の作った正規表現の場合、上手く行く時と行かない時があるので、 正規表現にかける為に取得した文字列が正しくない可能性もあるのかと 思いました。 ありがとうございました。 またお願いします。

noname#39970
noname#39970
回答No.1

[ ]?[0-9]+ で空白0か1つと数字1桁以上

sollalice
質問者

お礼

ありがとうございます。 自分の環境が特殊な条件(?)なのか上手く行きませんでした。 ありがとうございました。 またお願いします。

関連するQ&A