100日後にエンジニアになるキミ - 51日目 - OS - クーロンについて

昨日までのはこちら

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)


本日はクーロンに関するお話です。

## クーロン(cron)って何？

簡単に言うとクーロン`cron`とはMacとかLinuxとかに入っているプログラムのひとつです。

`何時にこのプログラムを動かしたい！！`のようにプログラムを定期実行をさせたいときに用いる機能になります。



## クーロンの使い方

### crontabコマンドの実行

クーロンは`crontab`コマンドで設定することができます。

初めて`crontab`を起動する時は、何も記述されていないはずなので
`crontab`を起動する際には`-e`オプションを付けて起動します。

```terminal
$crontab -e
```

実行するとこんな入力画面に切り替わります。

<img width="289" alt="スクリーンショット 2020-05-10 15.51.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/2ec12882-45ef-4c29-7b3d-622544c940a1.png">

ここからは`vim`を用いて設定をしていくことになるので`vim`の使い方も後ほどお伝えします。

### クーロンの書き方
クーロンの書き方は以下のようになります。

```crontab
分 時 日 月 曜日 実行するコマンドのパス(絶対パス)
```
各項目の間は半角スペースで開けます。
各要素の設定可能な数値は以下の通りです。

| 項目 | 数値 |
|:--:|:--:|
| 分 | 0-59 |
| 時 | 0−23 |
| 日 | 1-31 |
| 月 | 1-12 |
| 曜日 | 0-7(0,7が日曜日) |

この数値の指定の仕方は以下の通りになります。

| 指定方法 | 説明 | 設定例 |
|:--|:--|:--:|
| リスト指定 | 値を`,`カンマ区切りのリスト指定 | 0,10,30 |
| 範囲指定 | `開始-終了`の範囲で指定 | 1-5 |
| 間隔指定 | `*/数値`の間隔で指定 | */10 |
| ワイルドカード | `*`で指定 | * |

実行日時を記述した後に`実行するコマンドのパス`を`絶対パス`で記述します。

cron例：

```
30 8 * * * python3 /Users/ss/Desktop/py_pn/ mezamashi.py
```

これは毎朝8:30にDesktopに配置したPythonプログラムを実行すると言う意味になります。

色んな日時の設定例を載せておきます。

```terminal
# 毎日24:00
0 0 * * * command

# 毎時5分
5 * * * * command

# 毎週月曜8:10
10 8 * * 1 command

# 毎週金曜21:30
30 21 * * 5 command

# 毎月5日の10:20
20 10 5 * * command

# 毎年12/25日の10:20
20 10 25 12 * command

# 0分、5分、10分、……、55分
*/5 * * * * command

# 1分、6分、11分、……、56分
1-56/5 * * * * command

# 2分、7分、12分、……、57分
2-57/5 * * * * command

# 3分、8分、13分、……、58分
3-58/5 * * * * command

# 4分、9分、14分、……、59分
4-59/5 * * * * command
```

間隔指定のものは`5`,`10`など割り切れるものの方がわかりやすいですね。
後はこれを正しく入力するだけです。

## vimの使い方

`vim`とは何かと言うと、MacやLinuxに備わっているテキストエディターになります。
コマンドラインからの入力はこういったテキストエディターを用いての入力に切り替わるので
操作方法を覚えておかないといけません。

### モード

`vim`には２つのモードがあり通常時の`ノーマルモード`と入力時の`入力モード`があります。
どっちのモードか分からなくなったら`escキー`を入力して`ノーマルモード`に戻りましょう。

まず`vim`を起動した際のモードは`ノーマルモード`になっていると思います。
`ノーマルモード`では行える操作の一部を紹介します。

| 操作 | vim |
|:--|:--|
| ↑ | k |
| ↓ | j |
| ← | h |
| → | l |
| 一文字削除 | x |
| 入力モードへ | i |
| 次行を新規行として挿入して入力モードへ | o |
| 現在行に新しい行を追加して入力モードへ | O |
| 上書き保存 | :w |
| 名前をつけて保存 | :w ファイル名 |
| 編集終了 | :q |
| 保存して終了 | :wq または :x |
| ファイルを開く | :e ファイル名 |

`:`コロンをつけて各種キーを入力してエンターキーで実行できます。
試しに入力を抜けてみると

<img width="199" alt="スクリーンショット 2020-05-10 16.23.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/845c1da5-7364-f32b-4f41-d679c6a0ab67.png">

ターミナルの画面に戻ります。

さて`入力モード`の方の説明に入ります。

`crontab -e`からクーロンを開くと`ノーマルモード`の状態なので
`i`を入力して`入力モード`に移ります。

<img width="303" alt="スクリーンショット 2020-05-10 16.28.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/1b550502-446e-d0db-ff96-d6be786d24f9.png">

`入力モード`に移るとこのような画面になると思います。
この状態で文字を打ち込むことができます。

試しにクーロン設定をしてみましょう。

```
30 8 * * * python3 /Users/ss/Desktop/py_pn/ mezamashi.py
```

<img width="563" alt="スクリーンショット 2020-05-10 16.29.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/a7516293-a43d-abf8-1c91-923c42d12cad.png">

入力できたら保存を行います。
保存するには`ノーマルモード`に戻る必要があるので`escキー`を押して戻ります。

`ノーマルモード`に戻ったら、`:wq`を打ち込んでエンターキーで保存して終了します。

<img width="565" alt="スクリーンショット 2020-05-10 16.31.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/dba5b96f-d5af-169b-300d-b6f426d9e16c.png">

ちゃんと保存できたかを確認してみましょう。
すでに入力ずみの`cron`がある場合は`crontab -l`で閲覧することができます。

```terminal
$crontab -l
```

<img width="601" alt="スクリーンショット 2020-05-10 16.32.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/379626/55afa8cf-926d-5fce-bf6b-eee78790b0c7.png">

これでクーロンが反映されていることが確認できました。

### クーロンの確認

クーロンが動いたかどうかを確認するにはその日時になっていないと確認は難しいです。

初めは日時を2分毎とかすぐ実行できる間隔にしておき、プログラムが動いたかどうかは
実行時間になったら`ps`コマンドで実行プロセスの確認をするか
ログ出力などをしておき、実行されているかどうかを確認します。

プロセスが立ち上がらなかったり
ログなどが出ない場合は実行されていないことが想定されます。

実行するプログラムのパスの書き方などに誤りがないかを確認してみましょう。

### クーロンの読み込み

0から`vim`を用いて入力するのは始めたの人には容易ではないかと思います。
加えて大量のクーロン設定を行う場合も向いていないため
あらかじめ作成しておいたクーロン設定をファイルから読み込みすることができます。

```terminal
$crontab ファイルパス
```

これでファイルから読み込みして設定することができます。

実は`crontab`コマンドには`-r`と言うオプションがあり削除をしてしまいます。
`-e`と`-r`は隣同士なので、コマンドの打ち間違えでうっかり削除をしてしまうことがあります。

そのことを防ぐために、あらかじめ設定ファイルを作ってきファイルから読み込みした方が安全です。
実務でクーロンの操作を行う場合はファイル化しておきましょう。

### クーロンの書き出し

現在設定されているクーロンの内容は`crontab -l`で確認できます。
後はこれをファイルに書き出してあげるだけです。

`crontab -l > ファイルパス`

```terminal
$crontab -l > crontab.old
```

これでファイルに書き出されます。



## まとめ

最近ではサーバーレスで定期実行が出来るようなサービスもあったりしますが
サーバー上でプログラムを定期実行させたりする際にクーロンが使われます。
設定の仕方などを覚えておきましょう。

自分のPC上で定期実行をさせたい場合も役立つので覚えておいて損はありません！！

君がエンジニアになるまであと49日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython