Amazon Linuxで起動スクリプトが動かなかったときのメモ

2015.02.23

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

パネポン対戦者絶賛募集中の横山です。

本日は起動スクリプトで嵌った時のメモです。

検証していたOSはAmazon Linux 2014.09です。

発端

https://github.com/treasure-data/omnibus-td-agent」こちらのインストール手順まとめてました。 t2.microだとメモリ不足でt2.small以上じゃないとビルド出来ないなーと思いつつ、rpmの作成までいき、rpmを使いインストールしました。

あとは、起動&停止確認したらまとめよう!と思ったら…

$ sudo service td-agent start
$

…はて?いつもなら [ OK ] もしくは [ FAILED ] の文字が出るのに何も出ない…どういうことだ?

調査

とりあえずshell bangに #!/bin/bash -xv を入れて起動すると、

$ sudo service td-agent start
#!/bin/bash -xv
#
# /etc/rc.d/init.d/td-agent
#
# chkconfig: - 80 20
# description: td-agent
# processname: td-agent
# pidfile: /var/run/td-agent/td-agent.pid
#
### BEGIN INIT INFO
# Provides:          td-agent
# Default-Stop:      0 1 6
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# Short-Description: td-agent's init script
# Description:       td-agent is a data collector
### END INIT INFO

set -e
+ set -e

# Source function library.
. /etc/init.d/functions
+ . /etc/init.d/functions
# -*-Shell-script-*-
#
# functions	This file contains functions to be used by most or all
#		shell scripts in the /etc/init.d directory.
#

TEXTDOMAIN=initscripts
++ TEXTDOMAIN=initscripts

# Make sure umask is sane
umask 022
++ umask 022

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
++ PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH
++ export PATH

# Get a sane screen width
[ -z "${COLUMNS:-}" ] && COLUMNS=80
++ '[' -z '' ']'
++ COLUMNS=80

[ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="$(/sbin/consoletype)"
++ '[' -z '' ']'
/sbin/consoletype)"
/sbin/consoletype)
/sbin/consoletype
+++ /sbin/consoletype
++ CONSOLETYPE=pty
[ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="`/sbin/consoletype`"

で止まってることがわかりました。

でも同様に /etc/init.d/functions を使ってる、httpdの起動スクリプトは正常に起動できることが確認出来ました。

そこで2つの起動スクリプトのdiffを取ってみると

set -e

このコマンド、exit codeが0以外ですとスクリプト途中で止めてくれるものらしいです。

ここで先ほど止まったコマンドのexit codeを調べてみると…

$ /sbin/consoletype
pty
$ echo $?
2

となるので、ご親切に set -e の機能でシェルの実行を途中止めているみたいです。

とりあえず、 set -e をコメントアウトして実行したらサービスの起動を確認出来ました。

まとめ

起動スクリプトが動かない原因もそうですが、コマンドとして set -eがあることを初めて知りました。

RedHatやCentOSで起動するのに、Amazon Linuxでは起動しないとかある場合、もしかしたらこれが原因かも知れません。