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

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

新規登録して質問してみよう
ただいま回答率
85.50%
CentOS

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

3757閲覧

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

kumakumatan

総合スコア213

CentOS

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2016/09/21 02:34

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」を実行する権限はあるように思えます。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

#!/bin/bash -x

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

投稿2016/09/21 02:40

ynakano

総合スコア1894

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

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

投稿2016/09/21 02:37

t_obara

総合スコア5488

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2016/09/21 03:02

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

2016/09/21 03:43

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問