Ubuntuでcronにトライ

# サマリ
Ubuntuで簡単な定期処理をcronで実行してみました。

# 背景
以前よりcron、crontabという単語は聞いたことがあったのですが、
自分で使ったことはなかったので実際にやってみました。

# ゴール
簡単な定期処理を実行し、ログに出力されていることを確認する

# 対象読者
- cronに興味がある方

# 前提
必須：Linux系ディストリビューションの環境（今回はUbuntuを使用）
推奨：コマンドに関する大まかな知識

# 環境
- ホストOS：Window10 Home
- WSL：WSL2
- Ubuntu：22.04.2 LTS

# 手順
手順に入る前にまず前提条件の補足です。

そもそもcronとは、ということでWikipediaによると以下の通りです。

https://ja.wikipedia.org/wiki/Crontab

> crontab（クロンタブ、あるいはクローンタブ、クーロンタブとも）コマンドはUnix系オペレーティングシステム (OS) において、コマンドの定時実行のスケジュール管理を行うために用いられるコマンドである。

つまり、Unix系のOSで使うことができるコマンドのため、
今回はUbuntuで実行してみることにしました。

Ubuntuが用意できれば専用マシンでも、VirtualBoxなどの仮想化ソフトウェアでもなんでも問題ないかと思いますが、
今回はWSL（Windows Subsystem for Linux）を使うことにしました。
WSLについては別途記事を書こうと思っているので割愛しますが、マイクロソフトが公式に提供している
Linuxのプログラムを動かすための仕組みで、
WSLをWindowsに入れるとデフォルトでUbuntuが入る（はず）なので、
使いやすさ（わざわざVirtualBoxなどのソフトを起動しなくてよい）もあって今回はWSLにしました。

cronについては自分も勉強中なのですが、
crontabというファイルに定期実行するジョブおよびその内容を書き込むことで、
指定したジョブが実行されるということのようです。
それでは、実際にcronを使ってみます。

今回は以下の記事を参考にさせていただきました。
ありがとうございました。

https://qiita.com/take10_29/items/3e63c09639e38a9a0890

### 実行するジョブの準備
今回はお試しということで、先ほど紹介した記事をベースにファイルを用意しました。
まずは実行ファイルです。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/934bf641-98ac-f887-8784-bae68fe691b2.png)


記事と同じtest.shを準備しました。
試しに`sh test.sh`で実行するとhelloの文字が返ってきます。

また、`ls`コマンドでlogのテキストファイルも作成されていることもわかります。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/5dfcd7b0-d72b-6ae1-6bfc-2a1804c84fb6.png)

ログの中身も確かに記載されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/e9a95d47-ef1c-013f-80e1-a416c7453486.png)



### cronの実行

それでは上記で準備したshファイルを実行します。
crontabコマンドで実行します。

コマンドオプションですが、オラクルのHPに説明があったので抜粋させていただきます。

https://docs.oracle.com/cd/E56342_01/html/E54074/crontab-1.html

詳細は上記URLを参照ください。


> -–e
> 現在のユーザーの crontab ファイルのコピーを編集します。crontab が存在しない場合は、空のファイルを作成して編集します。編集が終了すると、このファイルがユーザーの crontab ファイルとしてインストールされます。
> 
> –e オプションを指定してファイルを編集するときに起動するエディタは、環境変数 EDITOR によって決まります。crontab のジョブを登録するときは、必ず crontab を使用してください。crontab ファイルを直接編集してジョブを追加しないでください。これは、cron はこの方法による変更を認識しないためです。
> 
> crontab ファイル内のすべての行を削除すると、古い crontab ファイルが復元されます。すべての行を削除する正しい方法は、–r オプションを使用して crontab ファイルを削除する方法です。
> 
> username が指定された場合、 現在のユーザーの crontab ファイルではなく、指定のユーザーの crontab ファイルを編集します。これを行えるのは、root と solaris.jobs.admin 承認を持つユーザーだけです。
> 
> –l
> crontab を起動したユーザーの crontab ファイルの内容を表示します。–l オプションのあとにユーザー名を指定して、指定のユーザーの crontab ファイルを表示できるのは、root または solaris.jobs.admin の承認を受けているユーザーだけです。
> 
> –r
> crontab ディレクトリからユーザーの crontab を削除します。r オプションのあとにユーザー名を指定して、指定のユーザーの –crontab ファイルを削除できるのは、root または solaris.jobs.admin の承認を受けているユーザーだけです。

ということで、今回は-eオプションを付けてcrontabファイルを編集し、test.shを定期実行できるようにします。

コマンド実行すると以下のようにメッセージが出ました。


![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/5f1c85fe-2d61-0a53-f5cb-5adeefc8d745.png)


簡単ということなので、nano（1.）を選択。

すると直後にこのような画面がでます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/9bb9f1fb-8171-1916-5b09-6a0fc7da53da.png)





記事を参考に記述します。
左から分、時、日、月、曜日（0-6で0が日曜）になります。
今回は毎分、毎時、毎日、毎月、曜日はすべて*
で実行します。
（参考にした記事では分の部分が*/1になっていましたが、*でも問題なく実行できました。）

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/3653fe32-7215-73f2-2747-ed30d9a7010d.png)

正しく1分ごとにログが更新されており、問題なくtest.shが実行されていることがわかりました。

![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/be16fd38-fb0b-f526-fde0-aa9f4f158820.png)


自分特有だと思いますが、作業フォルダをtestとしてその配下にtest.shを作った関係か、
testlog.txtのファイル生成先がshがあるtestディレクトリの一つ上にできてしまったので、
焦りました。。
（test.shを以下のように書き換えることでshと同じ階層にログを出力することができました。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/335813/a0bfe75c-b8f7-d82a-983e-9e05e0980ec3.png)


# 結果
無事crontabによる定期処理を実行することができました。

# 学び
思ったより簡単に定期処理をすることができる

# まとめ
今後はもう少し複雑な処理も定期実行できるようにしたいです。