【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

こんばんは。

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したいです。
上手い方法があったら御教授下さい。
よろしくお願いします。

A 回答 (4件)

qmailはよくわからないのですがkillallは使えないのでしょうか?


また、/var/runなどにpidは保存されないのでしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

ありがとうございました。
またお願いします。

お礼日時:2006/12/19 10:42

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 ではうまく行かないと言うことですか?
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2006/12/19 10:47

4/5桁両方対応だと \s?[0-9]{4,5} でOKなはずです。



4桁のみなら \s[0-9]{4}
5桁のみなら [0-9]{5}

でいけると思います。
正規表現しか知識がないので1行ずつ読み込んでいるのか
そうでないのかすらわからないのですが、
一行ずつ読み込んでいる処理の場合は
上記の正規表現に文頭を示す「^」を入れるとよいです。

うまくHitしないのは[0-9]の次の*かもしれません。
いくらあっても、もしくはなくてもいいよってことなので。
*(0回以上いくらでも)を+(1回以上いくらでも)に変えれば
改善されるかもしれません。

もしそれでも改善されない場合、正規表現の記法の問題ではなく
その他の点に問題がある可能性を考えてみてください。

この回答への補足

ありがとうございます。

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

補足日時:2006/12/19 10:43
    • good
    • 0

[ ]?[0-9]+


で空白0か1つと数字1桁以上
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2006/12/19 10:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!