manpageによると-lオプションを指定しなかった場合のload factorのデフォルトは0.8。SMPのようなマルチコア、マルチプロセッサの場合、load averageが0.8ということは1つのCPU以外は殆ど仕事していないということになる。これでは効率が悪いので-lでload factorオプションを指定する。例えばOSから2個のプロセッサが有るように見える場合は、2-1よりもload factorを大きくすると良い。今回は1.8にする。load factorは以下のようにして指定する。
atd -l 1.8
/etc/init.d/atdを編集してstart_daemonの引数にオプション -l 1.8等とすれば問題ないのだけど、これがベストな方法か判断ができないということ。まずは/etc/init.d/の配下にあるデーモン起動スクリプトでオプション追加の定石を学ぶ。grepで起動スクリプトを走査し、start_daemonに引数を与えているスクリプトを探すとexim4のそれが見つかる。
# grep -A 4 start_daemon /etc/init.d/* /etc/init.d/atd: start_daemon $DAEMON /etc/init.d/atd- log_end_msg $? /etc/init.d/atd- ;; /etc/init.d/atd- stop) /etc/init.d/atd- log_daemon_msg "Stopping deferred execution scheduler" "atd" -- /etc/init.d/exim4: start_daemon -p "$PIDFILE" \ /etc/init.d/exim4- "$DAEMON" -bd "-q${QFLAGS}${QUEUEINTERVAL}" \ /etc/init.d/exim4- ${COMMONOPTIONS} \ /etc/init.d/exim4- ${QUEUERUNNEROPTIONS} \ /etc/init.d/exim4- ${SMTPLISTENEROPTIONS} -- /etc/init.d/exim4: start_daemon -p "$PIDFILE" \ /etc/init.d/exim4- "$DAEMON" -bd \ /etc/init.d/exim4- ${COMMONOPTIONS} \ /etc/init.d/exim4- ${SMTPLISTENEROPTIONS} /etc/init.d/exim4- log_progress_msg "exim4_listener" /etc/init.d/exim4: start_daemon -p "$QRPIDFILE" \ /etc/init.d/exim4- "$DAEMON" -oP $QRPIDFILE \ /etc/init.d/exim4- "-q${QFLAGS}${QUEUEINTERVAL}" \ /etc/init.d/exim4- ${COMMONOPTIONS} \ /etc/init.d/exim4- ${QUEUERUNNEROPTIONS} -- /etc/init.d/exim4: start_daemon -p "$QRPIDFILE" \ /etc/init.d/exim4- "$DAEMON" -oP $QRPIDFILE \ /etc/init.d/exim4- "-q${QFLAGS}${QUEUEINTERVAL}" \ /etc/init.d/exim4- ${COMMONOPTIONS} \ /etc/init.d/exim4- ${QUEUERUNNEROPTIONS} -- /etc/init.d/exim4: start_daemon -p "$PIDFILE" \ /etc/init.d/exim4- "$DAEMON" -bd \ /etc/init.d/exim4- ${COMMONOPTIONS} \ /etc/init.d/exim4- ${SMTPLISTENEROPTIONS} /etc/init.d/exim4- log_progress_msg "exim4_listener"
/etc/init.d/exim4の内容から、start_daemonに与えているオプションは"$DAEMON"以下に続く変数に格納されていることがわかる。例えばCOMMONOPTIONS変数の定義されている部分を/etc/init.d/exim4のなかから探すと見つからない。
# grep COMMONOPTIONS /etc/init.d/exim4 ${COMMONOPTIONS} \ ${COMMONOPTIONS} \ ${COMMONOPTIONS} \ ${COMMONOPTIONS} \ ${COMMONOPTIONS} \
/etc/default配下のファイルにデフォルト起動オプションが書かれていることが良くあるので、/etc/init.d/exim4の中から/etc/defaultを探すと以下のような内容がヒットする。つまり、/etc/default/exim4が有る場合はこれを読み込むということだ。
# grep "/etc/default" /etc/init.d/exim4 [ -f /etc/default/exim4 ] && . /etc/default/exim4
そこで/etc/default/exim4から設定項目を抜き出すと以下のようになる。この中でCOMMONOPTIONS変数が定義されていることがわかる。
# grep -v '^$' /etc/default/exim4 | grep -v '#' EX4DEF_VERSION='' QUEUERUNNER='combined' QUEUEINTERVAL='30m' COMMONOPTIONS='' QUEUERUNNEROPTIONS='' QFLAGS='' SMTPLISTENEROPTIONS=''
そこで、今回はexim4の方法を踏襲してみる。オプションは変数OPTIONSで与えて、変数の定義は/etc/default/atdで行い、これを/etc/init.d/atdから読み込むことにする。以下のようにして/etc/default/atdにOPTION変数を定義させる。
# echo "OPTIONS='-l 1.8'" >> /etc/default/atd # cat /etc/default/atd OPTIONS='-l 1.8'
/etc/init.d/atdを編集して、以下の最終行を追加する。これで/etc/default/atdがある場合はこれを読み込む。
# vi /etc/init.d/atd PATH=/bin:/usr/bin:/sbin:/usr/sbin DAEMON=/usr/sbin/atd [ -f /etc/default/atd ] && . /etc/default/atd
同様に、start_daemonにOPTION引数を指定する。
start_daemon $DAEMON $OPTIONS
diffを取ると以下のようになる。
# diff /etc/init.d/atd.old /etc/init.d/atd 18a19 > [ -f /etc/default/atd ] && . /etc/default/atd 27c28 < start_daemon $DAEMON --- > start_daemon $DAEMON $OPTIONS
この後にデーモンを再起動する。
# /etc/init.d/atd restart Stopping deferred execution scheduler: atd. Starting deferred execution scheduler: atd.
最後にpsで引数を確認すると-l 1.8が追加されていることがわかる。
ps ax | grep /atd 4500 ? Ss 0:00 /usr/sbin/atd -l 1.8
最後にbatchで追加して走ったかどうかを確認する。
$ batch warning: commands will be executed using /bin/sh at> date at> <EOT> job 4 at Sun Apr 10 03:26:00 2011