質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.45%

  • CentOS

    3220questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • シェル

    283questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

  • cron

    222questions

    cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

pingの状況によってサービスを停止させるシェルスクリプトについて

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 1,051

ssall

score 21

■ご質問概要
下記のシェルスクリプトをcrontab -eで1分おきに実行するようにしたのですが、実際にコマンド実行するとうまくいくものの、cronで実行されるとうまくいきません。シェルスクリプトの書き方をようやく昨日知ったばかりの素人なので大事なことが抜けているかもしれないのですが何か解決方法をご教示頂けませんでしょうか。

シェルスクリプト内容

#!/bin/sh
IP_ADDR_ARRAY=("192.168.10.10");

NUM=0
for IP in ${IP_ADDR_ARRAY[@]}
do
ping ${IP} -c 1 >> /dev/null
if [ $? == 0 ] ;
  then
    echo ""
  else
    echo "${IP} : NG"
    command1="service keepalived stop"
    eval $command1
    command2="service pound stop"
    eval $command2
  fi
  NUM=`expr ${NUM} + 1`
done

※IPは適当なものを記載しています。

crontab -e 内容

LOCALE=C
*/1 * * * * cd /etc/keepalived/script && ./ping.sh

■コードの内容
冗長化先のサーバのIPアドレスへpingを飛ばして、うまくいかなければkeepalived及びpoundというサービスを止めたい。

■背景
CentOS6のサーバにpoundを入れてロードバランサーとして利用しようとしているのですが、障害対策でもう一台同じ内容のサーバを作成してkeepalivedというサービスを利用してVIPを付与して、マスターのサーバが落ちたときにスレーブ側がVIPを引き継ぐようにしました。
サービス、サーバが落ちたときはこれで大丈夫なのですが、サーバ間の通信が切れてしまった場合にどちらも生きているにもかかわらず、相互に落ちているという認識になりどちらもVIPが付与されてしまう状態になりました。
そのため、ホスト側からスレーブ側に定期的にpingを飛ばして、飛ばなくなったらホスト側のサービスを停止してスレーブが生きている状態にしようとしております。

以上です。
基本的な部分で何か間違っていて本質とは違う部分からミスがありましたら申し訳ありません。
宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

これは、cron使う上で良くぶち当たる問題ですね。

crond実行時は、普段読み込んでいるパスの設定を読み込まないため、
evalがどこにあるかわからない状態であるためです。

以下に変更してください。

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin # ← ご自身のPATHに変更してください
LOCALE=C
#*/1 * * * * cd /etc/keepalived/script && ./ping.sh
* * * * * sh /etc/keepalived/script/ping.sh # ← 絶対PATHにしてください

もしくは /etc/crontab のヘッダーを変更してください。

尚、「*/1 * * * *」のところは、1分間隔の場合「* * * * *」で良いです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/28 13:58

    lazhuward様
    ご回答いただき有難うございます。
    cronの中身をご教示頂いたものに変更したら期待通りに動作しました!有難うございます!
    なるほど、パスの設定が必要なのですね。もう少し調べて勉強します。
    解決の答えとなる回答を頂けたのでベストアンサーとさせて頂きます。
    s.t.様含めご回答頂き有難うございました。

    キャンセル

+1

/var/log/cron
でクロンのログを見てみてください。
エラーとか出てないでしょうか?

*/1 * * * * sh /etc/keepalibed/script/ping.sh >>/tmp/ping.log 2>>/tmp/ping-err.log

とかで設定すれば、どこでエラーが出ているかがわかるかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/28 13:09

    s.t.様

    ご回答有難うございます。

    ご教示頂いた内容にcrontabの中身を書き換えてみたのですが、ping-err.logに下記のように表示されております。
    ./ping.sh: line 14: service: command not found
    ./ping.sh: line 16: service: command not found

    なお、/var/log/cron内にはエラーログは吐かれていませんでした。
    ping.logには下記のように記述されていました。
    192.168.10.10 : NG

    コマンド実行時には質問欄にて記載のシェルをそのまま実行すればうまくいったのですが、エラー内容をみるとcommand not foundと出てしまうようです。

    キャンセル

  • 2017/03/28 13:25

    service keepalived stopなどのコマンドを利用できる権限をもったアカウントで
    crontab -eを編集してますでしょうか?

    /var/spool/cron/にcrontabで編集するファイルがあります。
    アカウントによってファイルが異なります。

    キャンセル

  • 2017/03/28 13:52

    [root@localhost ~]# crontab -e
    で実行しているためrootで実行していると思うのですが、、、rootでも権限はないのでしょうか。

    /var/spool/cron内にはrootというファイルが一つだけありました。
    確かに中身はcrontab -eで触っていたものと同じものでした。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • CentOS

    3220questions

    CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

  • シェル

    283questions

    シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

  • cron

    222questions

    cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。