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