Linuxで自動実行,Linuxで自動起動、定期的に実行

Last Modified Mar 1 2003

1 /etc/init.dに登録し起動時に実行する方法
2 crontab に登録し定期的に実行する方法
3 atコマンドの利用


1 /etc/init.d に登録する方法


 起動時に動かしたいプログラムはRedHat系では/etc/rc.d/rc.localに命令を記述しておけば
解決しますが、Debianではそのディレクトリやファイルがありません。
Debianでは/etc/init.d/にスクリプトファイルを記述してupdate-rc.dコマンドで登録をします。


起動時にsnort(サーバに届いた不正なパケットをチェックするプログラム)を実行する。

(1)まずスクリプトファイルを作成します。
/etc/init.d/mysnort
snort -Dde -c /etc/snort/snort.conf

中身は上のたったの一行です。

(2)属性を実行可にします。

# chmod a+x /etc/init.d/mysnort

(3)登録します。

# update-rc.d mysnort defaults

これで登録できました。
/etc/rc0.d/ から /etc/rc6.d/ までのディレクトリにK20mysnortという
ファイルができています。 20という数値が起動順番で defaults を指定すると
20 になります。rc0.0 から rc6.d はたぶんランレベルだと思います。(確認してません。)
ランレベルだとしたら0:停止状態 、1:シングルユーザモード、2:マルチユーザモード
3:拡張マルチユーザモード、4:? ,5:? ,(4または5はXwindowのために使用かな?)
6:リブートモード だと思います。たぶん。(<--- 思い込みで書いてます。)

起動順番はデフォルトでは20になります。起動順を変えるには defaults のあとに
数値を追加します。

書式 update-rc.d スクリプトファイル defaults [数値]

因みに削除するときは
update-rc.d スクリプトファイル remove
です。/etc/init.d/下にファイルが残っていると消えないかもしれません。
そのときは-fオプションを使用して
update-rc.d -f スクリプトファイル remove
とします。

2 crontab に登録し定期的に実行する方法

例として全文検索システムnamazuのインデックスファイルを作成するmknmz コマンドを
毎週日曜日、午前3時に実行します。インデックスは/home/karappi/public_html以下の
ドキュメントを対象にし、インデックスファイルを置く場所は
/home/karappi/public_html/nmz_index/ とします。


(1)まずスクリプトファイルを作成します。
/home/karappi/namazu.bat としました。
#!/bin/sh
cd /home/karappi/public_html/nmz_index/
/usr/bin/mknmz /home/karappi/public_html/

(2)属性を実行可にします。
chmod 700 namazu.bat

(3) crontab への登録
corontab -e を実行すると登録のエディタ(vi と同じ)が起動します。
登録は 「分 時間 日 月 曜日 コマンド」の順である。
毎週、日曜日(0が日、1が月、2が火、・・6が土)、夜中の3時 0分に実行するには
0 3 * * 0 /home/karappi/namazu.bat
となります。

リストはcrontab -l 削除はcrontab -r です。




3 atコマンドの利用

(1) 次の例は30分毎にps axでwebcamがあるかどうかをチェックします。
ps ax の中にwebcamという行が2行以外(-ne: not equal)の場合、
webcamを起動します。(正常にwebcamが動作しているときはwebcamの本体プロセスと、
このgrep webcamのコマンド、そしてこのchkwebcam.shのシェルの3行がpsで出力されます。しかしatコマンドでこのshが実行されたときはシェ ルの分は表示されません。)
/home/karappi/chkwebcam.sh
#!/bin/sh
ps ax | grep webcam > tmp.log
let x=$(/usr/bin/wc tmp.log | /usr/bin/cut -f7 -d " ")
if [ $x -ne 2 ]
then
webcam &
date >> re.log
fi
at +30 minutes -f chkwebcam.sh >& log

 上の中身が記述されているchkwebcam.shを1回実行しておきます。
 ./chkwebcam.sh

すると最後の行で再び、自分自身を30分後に登録してしまうので、永遠に30分毎にジョブが繰り返えされます。
 >&   でメッセージをlogに入れてますが、これを省くと標準出力されたメッセージの行き先が無く、結局オーナに30分ごとにメールで送られてしまいます。

因にこの30分毎のシェルを止めるにはatq でキューのリストを表示して、
atrm キュー番号
で削除します。


4 おまけ

1時間後ぐらいにシステムをシャットダウンしたいとき
# shutdown -h 60