LinuxのcrontabをCSVで出力するシェルスクリプト

はじめに
===

sedコマンドを使って、LinuxサーバのcrontabをCSVファイルで出力するbashシェルスクリプトを作成してみました。
https://github.com/na0AaooQ/crontab-to-csv

実行方法を以下に記載致します。

環境
===

このスクリプトは、Amazon EC2インスタンス(Amazon Linux)で試しました。
Amazon EC2インスタンスは以下のAMIで作成しました。

・amzn-ami-hvm-2016.03.3.x86_64-gp2 (ami-374db956)

crontabをCSV形式で出力するスクリプト
===

## (1) crontabをCSV形式で出力するスクリプトを作成します。

GitHubからcrontabをCSV形式で出力するスクリプトをダウンロードします。

```
[ec2-user@cloudwatch-example-server ~]$ git clone https://github.com/na0AaooQ/crontab-to-csv.git

[ec2-user@cloudwatch-example-server ~]$ cd crontab-to-csv
```

もしくは、GitHubへアクセス出来ないような環境の場合、以下のようにcrontabをCSV形式で出力するスクリプトを作成します。

```
[ec2-user@cloudwatch-example-server ~]$ vi crontab_to_csv.sh
```

```bash:crontab_to_csv.sh
#!/bin/bash

crontab_csv_file="crontab.csv"

echo "cron_host,cron_user,minutes,hours,days,months,day_of_the_week,cron_name,cron_parameter" > $crontab_csv_file
crontab -l | grep -v ^# | grep -v ^$ | grep -v MAILTO | sed -e "s/  */ /g" -e "s/ /,/1" -e "s/ /,/1" -e "s/ /,/1" -e "s/ /,/1" -e "s/ /,/1" | awk '{$0="'`hostname -s`','$USER'," $0 "";print}' >> $crontab_csv_file

if [ -f $crontab_csv_file ] ; then
  cat $crontab_csv_file
else
  echo "file not found $crontab_csv_file."
fi
```


```
[ec2-user@cloudwatch-example-server ~]$ chmod 755 crontab_to_csv.sh
```


```
[ec2-user@cloudwatch-example-server ~]$ cat crontab_to_csv.sh
#!/bin/bash

crontab_csv_file="crontab.csv"

echo "cron_host,cron_user,minutes,hours,days,months,day_of_the_week,cron_name,cron_parameter" > $crontab_csv_file
crontab -l | grep -v ^# | grep -v ^$ | grep -v MAILTO | sed -e "s/  */ /g" -e "s/ /,/1" -e "s/ /,/1" -e "s/ /,/1" -e "s/ /,/1" -e "s/ /,/1" | awk '{$0="'`hostname -s`','$USER'," $0 "";print}' >> $crontab_csv_file

if [ -f $crontab_csv_file ] ; then
  cat $crontab_csv_file
else
  echo "file not found $crontab_csv_file."
fi
[ec2-user@cloudwatch-example-server ~]$
```

crontabをCSV形式で出力するスクリプト実行例
===

## (2) crontabにバッチを登録します。

例として、Linuxサーバのcrontabに適当なバッチを登録します。

```
[ec2-user@cloudwatch-example-server ~]$ id
uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel)
[ec2-user@cloudwatch-example-server ~]$ crontab -e
```

```
[ec2-user@cloudwatch-example-server ~]$ crontab -l
MAILTO=************@example.com

##### EC2インスタンスのロードアベレージをCloudWatchに記録する
*/5 * * * * /home/ec2-user/cloudwatch_put_loadaverage.sh

##### EC2インスタンスのnginxプロセス数をCloudWatchに記録する
*/5 * * * * /home/ec2-user/cloudwatch_put_process.sh nginx

##### EC2インスタンスの / のディスク使用率をCloudWatchに記録する
*/5 * * * * /home/ec2-user/cloudwatch_put_disk_use.sh /

##### EC2インスタンスの / のiノード使用率をCloudWatchに記録する
*/5 * * * * /home/ec2-user/cloudwatch_put_disk_inode_use.sh /

##### テストcron
15 11 3 1 2 /home/ec2-user/example_cron.sh example_parameter test 1 2 3
33 7  * * 2 /home/ec2-user/example_cron.sh example_parameter test 1 2 3
[ec2-user@cloudwatch-example-server ~]$
```

## (3) crontabをCSV形式で出力するスクリプトを実行します。

実行前にCSVファイルが存在していない事を確認します。

```
[ec2-user@cloudwatch-example-server ~]$ ls -lrta crontab.csv
ls: cannot access crontab.csv: No such file or directory
[ec2-user@cloudwatch-example-server ~]$
```

作成したスクリプトを実行します。
crontabの登録内容がCSVで表示されます。

```
[ec2-user@cloudwatch-example-server ~]$ ./crontab_to_csv.sh
cron_host,cron_user,minutes,hours,days,months,day_of_the_week,cron_name,cron_parameter
cloudwatch-example-server,ec2-user,*/5,*,*,*,*,/home/ec2-user/cloudwatch_put_loadaverage.sh
cloudwatch-example-server,ec2-user,*/5,*,*,*,*,/home/ec2-user/cloudwatch_put_process.sh nginx
cloudwatch-example-server,ec2-user,*/5,*,*,*,*,/home/ec2-user/cloudwatch_put_disk_use.sh /
cloudwatch-example-server,ec2-user,*/5,*,*,*,*,/home/ec2-user/cloudwatch_put_disk_inode_use.sh /
cloudwatch-example-server,ec2-user,15,11,3,1,2,/home/ec2-user/example_cron.sh example_parameter test 1 2 3
cloudwatch-example-server,ec2-user,33,7,*,*,2,/home/ec2-user/example_cron.sh example_parameter test 1 2 3
[ec2-user@cloudwatch-example-server ~]$
```

## (4) crontabに登録している内容がcsvファイルに出力された事を確認します。

前述のスクリプトを実行すると、以下のようにcrontabの内容がCSVファイルとして出力されます。

```
[ec2-user@cloudwatch-example-server ~]$ cat crontab.csv
cron_host,cron_user,minutes,hours,days,months,day_of_the_week,cron_name,cron_parameter
cloudwatch-example-server,ec2-user,*/5,*,*,*,*,/home/ec2-user/cloudwatch_put_loadaverage.sh
cloudwatch-example-server,ec2-user,*/5,*,*,*,*,/home/ec2-user/cloudwatch_put_process.sh nginx
cloudwatch-example-server,ec2-user,*/5,*,*,*,*,/home/ec2-user/cloudwatch_put_disk_use.sh /
cloudwatch-example-server,ec2-user,*/5,*,*,*,*,/home/ec2-user/cloudwatch_put_disk_inode_use.sh /
cloudwatch-example-server,ec2-user,15,11,3,1,2,/home/ec2-user/example_cron.sh example_parameter test 1 2 3
cloudwatch-example-server,ec2-user,33,7,*,*,2,/home/ec2-user/example_cron.sh example_parameter test 1 2 3
[ec2-user@cloudwatch-example-server ~]$
```

出力されるCSVファイルの各フィールドは以下になります。

| 項目            | 内容                      |
|-----------------|--------------------------|
| cron_host       | cronを実行しているホスト名 |
| cron_user       | cronを実行しているユーザ名 |
| minutes         | cron実行タイミング(分)    |
| hours           | cron実行タイミング(時間)  |
| days            | cron実行タイミング(日)    |
| months          | cron実行タイミング(月)    |
| day_of_the_week | cron実行タイミング(曜日)   |
| cron_name       | cronバッチ名              |
| cron_parameter  | cronバッチのパラメータ     |

crontabの実行タイミングを指定しているフィールドは「,」区切りで、cronバッチ名とcronバッチパラメータは「,」区切りではなく、crontabに登録されている内容をそのまま出力しています。

***

以上になります。