30 January 2014

(Ubuntu) システム起動時にスクリプトを実行する (Postfixのresolv.confのチェックと書き戻しを行う)

Ubuntu Linuxでシステム起動時に特定のスクリプトを実行するには、/etc/init.d/のスクリプトを使うのが「正しそうな」方法だそうだ。

その方法を用いて、Postfixの/var/spool/postfix/etc/resolv.conf初期化チェックを行なってみる

■ 検証環境

・Ubuntu 12.04.4 LTS

■ 起動時のスクリプト実行の流れ

init → /etc/rc2.d/S00command → /etc/init.d/command → ユーザスクリプト

■ /etc/init.d/command の作成

/etc/init.d/ ディレクトリ内のファイルを参考に、次のようなinit用スクリプトを作る

/etc/init.d/user-command
#! /bin/sh
### BEGIN INIT INFO
# Provides:          user-command
# Required-Start:    $network $postfix
# Required-Stop:
# Should-Start:
# Default-Start:     2 3 4 5
# Default-Stop:      0 6
# Short-Description: postfix resolv.conf restore
# Description: if postfix mirror resolv.conf is cleared, copy it from /etc
### END INIT INFO
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin
SCRIPT_DIR=/usr/local/bin
 
case "$1" in
  start)
    ${SCRIPT_DIR}/user-command.sh
    if [ $? -eq 0 ]; then
      service postfix restart > /dev/null
    fi
    ;;
  stop)
    ${SCRIPT_DIR}/user-command.sh
    ;;
  *)
    echo "Usage: service user-command {start|stop}" >&2
    exit 1
    ;;
esac
 
exit 0

赤で着色したところが、initで主に使われる構文。(Upstartでは、構文が違う)

■ ユーザスクリプトの準備

/usr/local/bin/user-command.sh
#!/bin/sh
 
# copy /etc/resolv.conf to postfix's resolv.conf, if different.
 
cmp -s /var/spool/postfix/etc/resolv.conf /etc/resolv.conf > /dev/null
if [ $? -eq 1 ]; then 
 
  # ファイルが違っていたら、/etc から書き戻す 
  cp /etc/resolv.conf /var/spool/postfix/etc/ > /dev/null
  # syslogにメッセージを書き込む
  logger "postfix-sync-resolvconf.sh : restore /var/spool/postfix/resolv.conf" > /dev/null
  # 終了ステータス 0 を返す
  exit 0
 
else
 
  logger "postfix-sync-resolvconf.sh : check ok /var/spool/postfix/resolv.conf" > /dev/null
  # 終了ステータス 1 を返す
  exit 1
 
fi

■ スクリプトの有効化

# update-rc.d -f user-command defaults