heartbeatで切替しているDRBD構成のサーバで、
cron設定についても共通化したいという要望について調査と対応。
cronの実体は/var/spool/cron以下のファイルなので
まず、これをDRBDの対象ディレクトリ内部に含む形にして
シンボリックリンク化する。
DRBDの対象ディレクトリを/dataとした際に、
/var/spool/cronを/data/cron_spoolのシンボリックリンクとした。
mkdir -p /data/cron_spool
cp /var/spool/cron/* /data/cron_spool/
chmod 700 /data/cron_spool/
mv /var/spool/cron /var/spool/cron.bk
ln -s /data/cron_spool /var/spool/cron
こちらを参考にしつつ、heartbeatから呼び出すスクリプトについて修正した。
/etc/ha.d/haresources
#!/bin/bash
# get functions
. /etc/init.d/functions
# See how we were called.
case "$1" in
start)
rm -rf /var/spool/cron
ln -s /data/cron_spool /var/spool/cron
for textfile in $( ls /var/spool/cron ); do
logger -s -t "${textfile}" "setting up root crontab"
/usr/bin/crontab -u ${textfile} /var/spool/cron/${textfile}
done
echo
;;
stop)
logger -s "change crontab dir"
rm -rf /var/spool/cron
ln -s /var/spool/cron.bk /var/spool/cron
for textfile in $( ls /var/spool/cron ); do
logger -s -t "${textfile}" "setting up ${textfile} crontab"
/usr/bin/crontab -u ${textfile} /var/spool/cron/${textfile}
done
echo
;;
status)
for textfile in $( ls /var/spool/cron ); do
echo "$0 status: "
echo "crontab -u ${textfile} -l:"
crontab -u root -l
done
;;
*)
echo "Usage $0 (start|stop|status)"
;;
esac
exit 0
変更ポイントは、
- シンボリックリンクの張り替え
- root以外のユーザcronへの対応
となる。
非アクティブ時にわざわざcron.bkにシンボリックリンクを張り替えているが、
これは非アクティブ時にも実行して欲しいcronがあること(時刻合わせとかね)
また、/var/spool/cronの実体が存在しない状態で、シンボリックリンクだけが
残っている場合に、crondが起動しないことがあることが理由。