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

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

ただいまの
回答率

90.01%

centosでシェルを実行するには

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,427

kumakumatan

score 161

CentOS release 6.5 (Final)

にて、監視するシェルを作成して実行しています(crontab)にて。
下記のシェルを実行すると、「No such file or directory」と表示され
意図したように実施できません。

■ログメッセージ内容

grep: ./systemMonitor.ini: No such file or directory
/home/test/shell/mail/test.sh: line 46: [: ==: unary operator expected
/home/test/shell/mail/stest.sh: line 56: [: ==: unary operator expected


■シェル内容(test.sh)

#!/bin/bash

# ************************
# メールテンプレート
# ************************
# メール宛先
mail_to='ABC@xx.xx.xxx.jp'
mail_from='DEF@xx.xx.xxx.jp'

# メール件名
mail_subject_failure='【障害通知】'
mail_subject_recover='【復旧通知】'

# メール本文
# 障害検知版
mail_content_failure='障害を検知しました。\n\n
                        IP:xxx.xxx.xxx.xxx'

# 障害復旧版
mail_content_recover='復旧しました。\n\n
                        IP:xxx.xxx.xxx.xxx'

# ************************
# 処理
# ************************
# システム設定から設定値を取得
# 設定ファイル内に初期値として「isSent:false」を登録していること!!
isSent=$(grep isSent ./systemMonitor.ini)

# 設定キー:設定値を":"でセパレートして設定値を取得
OIFS="$IFS"; IFS=':'
isSent_array=($isSent); IFS="$OIFS"
isSent=${isSent_array[1]}

# ---------------------
# 監視処理
# ---------------------
# 監視処理を実行(レスポンスのコンテンツ取得結果から判定)
# レスポンスに「200 OK」が含まれているか?
# result=0:稼働停止、1:正常稼働

 result=`wget --spider -nv https://xxx.xxx.xxx.xxx:3000/web/login.html --no-check-certificate 2>&1 | grep -c '200 OK'`

# 「障害メールを送信済」 かつ 「サービスが復旧済」である場合
if [ ${isSent} == true ] && [ ${result} == 1 ]; then
    # メール送信(復旧通知)
    echo -e ${mail_content_recover} | mail -s ${mail_subject_recover} -r ${mail_from} ${mail_to}
    # メール送信済フラグをクリアへ更新
    isSent=false;
    # iniファイルを更新
    echo 'isSent:'${isSent} > ./systemMonitor.ini
fi

# 「障害メールを未送信」 かつ 「サービスが稼働停止」である場合
if [ ${isSent} == false ]; then
    if [ ${result} -ne 1 ]; then
        # メール送信(障害通知)
        echo -e ${mail_content_failure} | mail -s ${mail_subject_failure} -r ${mail_from} ${mail_to}
        # メール送信済フラグを送信済へ更新
        isSent=true;
        # iniファイルを更新
        echo 'isSent:'${isSent} > ./systemMonitor.ini
    fi
fi

「test.sh」と「systemMonitor.ini」は同一ディレクトリにあります。
2つのファイルがある場所「/home/test/shell/mail」にて
「 grep isSent ./systemMonitor.ini」を実施すると、
「isSent:false」とファイルの中身を表示する事ができます。

また、環境変数を調べると、

 echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/apache2/bin:/root/bin
なので、「/bin」があるので、「/bin/bash」を実行する権限はあるように思えます。

シェルを実行して意図した結果を得るにはどうしたらいいでしょうか?
ご教授をお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

cronで実行する時には基本的にrootユーザで動作します。
その際に動作するディレクトリが想定通りの場所なのか確認してはいかがでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/21 12:02

    すいません、crontabでとのことで、rootユーザで動作というのは間違いですね。
    $0に実行スクリプトのパスが入っているので、ディレクトリを抜き出して、
    それを設定するのが安全かもしれません。
    実行されるユーザのホームディレクトリで動作するのですが、
    「No such file or directory」
    というエラーは純粋に、その場所にファイルが見つからないということですので、
    動作ディレクトリを確認するのが一番ではあります。

    キャンセル

  • 2016/09/21 12:43

    '''
    */1 * * * * cd /home/test/shell/mail; ./test.sh
    '''
    crontabの中をディレクトリ移動してからシェル実行するようにしたらできました。
    ありがとうございます。

    キャンセル

0

回答は既に出ている通りですが、シェルスクリプトの1行目を

#!/bin/bash -x


とするとシェルスクリプトのデバッグができますよ。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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