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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

3回答

2402閲覧

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

b0nkeenu

総合スコア7

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

sh

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

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

1クリップ

投稿2017/08/18 02:05

編集2017/08/18 02:07

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での実行指示


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

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

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

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

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

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

hotta

2017/08/18 03:34

root になって sh /etc/rc.local でも動きますか?
b0nkeenu

2017/08/18 04:14

動きますね。。。
moonphase

2017/08/18 04:21

OSは何でしょうか?AmazonLinux, CentOS, Ubuntu, RHEL, Other?
b0nkeenu

2017/08/18 04:26

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

2017/08/18 04:27

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

2017/08/18 04:28

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

回答3

0

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

投稿2017/08/22 06:35

otn

総合スコア84499

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

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

0

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

bash

1sh /home/ec2-user/hogefuga.sh 2

の代わりに

bash

1sh ec2-user -c /home/ec2-user/hogefuga.sh 2 3```ではどうでしょうか?

投稿2017/08/18 05:33

hotta

総合スコア1613

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

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

0

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

bash

1su -l ec2-user << EOF 2... 3hogehoge... 4... 5EOF

投稿2017/08/18 04:49

moonphase

総合スコア6621

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

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

b0nkeenu

2017/08/18 05:28

無理でした。。。
moonphase

2017/08/18 05:33

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

2017/08/18 06:04

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

2017/08/18 06:32

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問