見出し画像

シェルスクリプトを定期実行してみよう

はい、皆さんこんにちは。
今回は 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 でいうところのタスクスケジューラーです。毎日とか毎月とか定期的にコマンドを実行したい時に使います。
スケジュールを管理するデーモン crondcrontabファイルを調べ、実行するべきスケジュールが存在した場合、そのジョブを実行します。

今回は毎分、先程作成したスクリプトファイルを実行します。

システムの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  929 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  928 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 コマンドが役に立ちます。

◆ tail コマンド
✅ファイルの末尾部分を表示する
✅デフォルトでは、最終行から10行が表示される

[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 を学ぶ誰かのお役に立てれば幸いです。

🔶🔷 シェルスクリプト関連記事 🔷🔶

おススメ学習書籍(Linux関連)


いいなと思ったら応援しよう!

MEVIUS(メビウス) @日系IT企業 | マーケターときどきなんちゃってエンジニア
もしこの記事が何かの参考になったもしくは面白かったという方は、応援していただけると大変嬉しいです😊 これからもよろしくお願いします。