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

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

ただいまの
回答率

87.78%

AWS EC2 AMIでのrc.localによるスクリプト自動起動について

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 4,178

score 7

rc.localでスクリプト自動処理を行ったことのある方に質問させてください。

概要を先に言うと、前は問題なく実行されていたのに、シェルスクリプトに手を加えた辺りから実行されなくなった、です。ディレクトリ等々変更したことはページ下方、■その他に記してあります。

/etc/rc.d/rc.localにシェルスクリプトを追加し、サーバーの起動時に追加したスクリプトを自動起動させたいのですが、どうも追加したファイルそのものを認識して実行しておりません。
その理由として、

cat /etc/rc.d/rc.local

#!/bin/bash
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
echo "before" >> /home/ec2-user/test.log #rc.localを読み込んでいるかのログ
sh /home/ec2-user/hogefuga.sh #自動起動させたいスクリプト
echo "after" >> /home/ec2-user/test.log #自動起動スクリプトが完了したかを見るログ


このように設定しインスタンスの再起動をしてもログにはbeforeしか現れず、更に、

cat /home/ec2-user/hogefuga.sh

#!/bin/bash
echo "in" >> /home/ec2-user/script_error.log

# --- 設定 ---
HOSTNAME=`hostname`
DATE=`date`
NUM=`ps aux | grep run_product_ | grep -v grep | wc -l`

#特殊なケースの二重起動防止
if [[ ${NUM} > 2 ]]; then
  echo -e "[ERROR] OTHER SCRIPT ALREADY RUNNING. PLEASE CHECK PROCESS."
  echo ${NUM}
  ps aux | grep run_product_ | grep -v grep
  exit 1
fi

sudo -u ec2-user bash << EOF #ここからは運用上ec2-userとして実行したい

# --- ホスト名で他OEMのスクリプト起動チェック防止 ---
if [ ${HOSTNAME} != 'ip-00-000-0-000' ]; then
  echo "[ERROR] THIS SCRIPT C'ANT BE USED IN THIS HOST"
  echo "${DATE} - [ERROR] This is not correct script.Please confirm relation between OEM and script." > /home/ec2-user/script_error.log
  exit 1
fi

echo "**********"
echo "********** run.sh $ENVIRONMENT start **********"
echo "**********"

cd /home/ec2-user/git/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

EOF #ec2-userここまで

このように起動させたいスクリプトの一番上にひとまずログを吐き出すように設定しても、
通っていないのかログすら出力されない次第であります。

従って今回rc.localは実行されているが、起動させたいスクリプトは読み込まれていないと判断致しました。

■私が確認した項目
・/etc/rc.d/rc.localの実行権限(問題なし)
・自動起動ではなく手動起動での/home/ec2-user/hogefuga.sh実行(手動だとスクリプトは問題なく実行される)
・/etc/rc.d/rc.localへのbash /home/ec2-user/hogefuga.sh記述トライ(sh時と変わらず不動)
・起動しようとしているスクリプトの権限(775で問題なし)

■その他
・今回実装するにあたって、既存の同ディレクトリ、同ファイルをディレクトリのリネームをしてバックアップとして補完、新しいものをgit cloneしそちらにシェルスクリプトの変更を適用。

・既存のシェルスクリプトで自動起動をrc.localに施すと問題なく起動する。

・スクリプトの変更点は、

#特殊なケースの二重起動防止
if [[ ${NUM} > 2 ]]; then
  echo -e "[ERROR] OTHER SCRIPT ALREADY RUNNING. PLEASE CHECK PROCESS."
  echo ${NUM}
  ps aux | grep run_product_ | grep -v grep
  exit 1
fi

sudo -u ec2-user bash << EOF #ここからは運用上ec2-userとして実行したい

# --- ホスト名で他OEMのスクリプト起動チェック防止 ---
if [ ${HOSTNAME} != 'ip-00-000-0-000' ]; then
  echo "[ERROR] THIS SCRIPT C'ANT BE USED IN THIS HOST"
  echo "${DATE} - [ERROR] This is not correct script.Please confirm relation between OEM and script." > /home/ec2-user/script_error.log
  exit 1
fi
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

EOF



二重起動防止の条件分岐と起動チェック防止条件、ヒアドキュメントによるec2-userでの実行指示


全体としてこのような感じです。
ここまで検証してみて、もうこれ以上は私の実力では手詰まりです。
もし解決方法や、原因かも知れない部分があればご教示願います。
どうぞ宜しくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • b0nkeenu

    2017/08/18 13:26

    AmazonLinuxです。また/etc/rc.local自体がインスタンス起動時に読み込まれていることは確認しております。

    キャンセル

  • b0nkeenu

    2017/08/18 13:27

    先程改めて調査した結果、スクリプト内でのユーザー変更(sudo -u ec2-user bash << EOF)の記述が良くないのでは無いか、という結論に至りました。

    キャンセル

  • b0nkeenu

    2017/08/18 13:28

    しかし、起動時に自動で実行されて欲しいスクリプトは仕様上rootではなくec2-userでないといけませんので、どうしてもユーザーを切り替えて実行を行う必要がありどうしたものかと悩んでおります。。。

    キャンセル

回答 3

0

sudoではなくsuでいけませんか?

su -l ec2-user << EOF
...
hogehoge...
...
EOF

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/08/18 14:28

    無理でした。。。

    キャンセル

  • 2017/08/18 14:33

    スクリプトを省略されている箇所に問題があるように感じます。
    原因を切り分けるために、本来実行しないスクリプト部分全体を以下に置き換えてみてください。

    echo "HOGEHOGE" >> /tmp/hogehoge.txt

    キャンセル

  • 2017/08/18 15:04

    すみません、ここまで調べていただいたのに別の方法から自動起動を実現させました。
    その方法は
    crontab -e で
    @reboot /bin/sh /home/ec2-user/hogefuga.sh
    とする方法です。
    clontabのユーザーがec2-userだったので、権限等々問題なく解消でき、
    @rebootの設定でサーバーの起動時に実行という要件が満たせました。

    お時間いただき誠にありがとうございました。

    キャンセル

  • 2017/08/18 15:32

    なるほど、その方法がありましたね。
    無事解決できたようで良かったです。

    キャンセル

0

hogefuga.sh の中で sudo するのをやめて、/etc/rc.local の中で

sh /home/ec2-user/hogefuga.sh


の代わりに

sh ec2-user -c /home/ec2-user/hogefuga.sh

ではどうでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

rootでファイルが読めないと言う事は、SELinuxでの保護でしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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