シェルスクリプトを定期実行してみよう
はい、皆さんこんにちは。
今回は bashシェルスクリプトを cronで定期実行し、それぞれの基本を学んでいこうと思います。
ちなみに、この記事で紹介するシナリオ自体は実戦では一切役に立ちません(笑)
Linux 初学者の方にこんな感じで動かすんだ程度で、操作や設定の参考にしてもらえればと思います。
スクリプトファイルの作成
まずはスクリプトファイルに実行させたい操作の内容を記述します。Windows でいうところのバッチファイル (.bat) です。このファイルに事前に記述されたコマンドが実行されます。
ただ、ここでは超意味もないコマンドを記述します。シェルスクリプトはプログラミング言語のひとつなわけで、奥が深いのでこの記事では細かなところには一切触れません。もう少し深堀⇓した内容は別の記事にしようと考えています。
テキストファイル(拡張子は sh )を、コマンドを記述しつつ作成します。今回は bashシェルスクリプトを作成するので、ファイルの一行目(スクリプトの先頭)に「 #!/bin/bash 」とパスを記述します。
[notedemo03@CENT03 crontest]$ vi JIC.sh
// リダイレクトを使って指定したファイル(今回の場合、crontabtestlog)の末尾に'just in case'を追加するように標準出力を変更
// 記述したファイル(今回の場合、crontabtestlog)が存在しない場合には、ファイルを作成してくれる
[notedemo03@CENT03 crontest]$ cat JIC.sh
#!/bin/bash
echo 'just in case' >> /home/notedemo03/crontest/crontabtestlog
cronについて
定期的にジョブを実行させたい場合に使用します。Windows でいうところのタスクスケジューラーです。毎日とか毎月とか定期的にコマンドを実行したい時に使います。
スケジュールを管理するデーモン crondが crontabファイルを調べ、実行するべきスケジュールが存在した場合、そのジョブを実行します。
今回は毎分、先程作成したスクリプトファイルを実行します。
システムのcrontab
crontabファイルの記述の仕方は、/etc/crontabファイルを覗くと分かります。また、このファイルに実行タイミングを記述し設定していきます。
毎日何時何分に、とか毎月何曜日の何時何分に、このコマンドを実行する、というように、以下の書式に従って半角スペースを使って記述します。
// システムのcrontabファイルの内容を確認してみる
[root@CENT03 ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
// crontabファイルの書式
分 時 日 月 曜日 実行ユーザー名 コマンド
ユーザーのcrontab
システムの場合と異なり、crontabコマンドで設定します。なお、ユーザーの crontabファイルは、/var/spool/cron ディレクトリに配置されます。
// 書式
$ crontab [オプション]
// crontab コマンドの主なオプション
+-------------+--------------------------------------------------+
| オプション | 説明 |
+-------------+--------------------------------------------------+
| -e | エディタを使ってcrontabファイルを編集する |
| -l | crontabファイルの内容を表示する |
| -r | crontabファイルを削除する |
| -i | crontabファイル削除時に確認する |
| -u ユーザー名 | (rootが)ユーザーを指定してcrontabファイルを編集する |
+-------------+---------------------------------------------------+
// 'notedemo03'のcrontabファイル
// 後述する'crontab -e'でcrontabファイルを作成していないと当然ながらこのファイルは存在しない
[root@CENT03 cron]# pwd
/var/spool/cron
[root@CENT03 cron]# ls -lA
合計 4
-rw------- 1 notedemo03 notedemo03 44 9月 29 23:48 notedemo03
rootユーザー以外でcrontabを設定してみる
作業ディレクトリ
今回作成したスクリプトファイルが格納されているディレクトリで、以降のコマンドを打っていきます。
[notedemo03@CENT03 crontest]$ pwd
/home/notedemo03/crontest
[notedemo03@CENT03 crontest]$ ls -lA
合計 4
-rw-rw-r-- 1 notedemo03 notedemo03 52 9月 28 22:48 JIC.sh
crontabコマンドで定期実行内容を設定
// notedemo03のcrontabファイルの内容を表示させる
[notedemo03@CENT03 crontest]$ crontab -l
no crontab for notedemo03 👈まだファイルには何も記述されていない
// エディタ(私の環境ではvi)を使って、crontabファイルを編集する
[notedemo03@CENT03 crontest]$ crontab -e
crontab: installing new crontab 👈編集が完了
// 再度、notedemo03のcrontabファイルの内容を表示させる
// 実行ユーザー名の指定フィールドは不要
[notedemo03@CENT03 crontest]$ crontab -l
* * * * * bash /home/notedemo03/crontest/JIC.sh 👈記述した内容が表示された
実行確認
今回のスクリプトは、テキストファイルに毎分追記していくものなので、過去の記事で勉強した tail コマンドが役に立ちます。
[notedemo03@CENT03 crontest]$ tail -f crontabtestlog
just in case
just in case
just in case
just in case
just in case
just in case 👈一分毎に最終行が追加され、'just in case'が追記されていく
^C 👈「Ctrlキー + Cキー」でコマンドを終了させた
後始末
このままだと、毎分一行ずつ記述が増えていきます。そして、何の役にも立たないファイルですし(笑)
なので、notedemo03 の crontabファイルを削除します。
// crontabファイルを削除する
[notedemo03@CENT03 crontest]$ crontab -r
もしくは
[notedemo03@CENT03 crontest]$ crontab -ri
crontab: really delete notedemo03's crontab? y
[notedemo03@CENT03 crontest]$ crontab -l
no crontab for notedemo03 👈ちゃんと削除された
以上となります。
最後までお読みいただきありがとうございました。少しでも Linux を学ぶ誰かのお役に立てれば幸いです。