やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

Amazon linuxで/etc/cron.d/配下または/etc/cron.hourly/配下にcronを設定する.

cronの設定方法はいくつかあって、どこにどう設定すればいいのかの、ベストプラクティスはまだよく分かっていません。
いったんpart1として/etc/cron.d/と/etc/cron.hourly/はいかに設定する方法をまとめておきます。

環境

まずはcron化したり作ると作成します。
僕の常套手段として、適当なpythonスクリプトを作ってslackに通知させます。
ログを出力してtail -f でもいいんですが、ログを出力するために画面を2つ出さなきゃいけないのがちょっと面倒くさいので、slackで受動的に確認します。

cron.d配下

cron化させるslack通知pythonスクリプト

import requests
import json

webhook_url = "https://XXXXXXXXXXXXXX"
requests.post(webhook_url, data = json.dumps({
    'text': u'Test', # 投稿するテキスト
    'username': u'me', # 投稿のユーザー名
    'icon_emoji': u':ghost:', # 投稿のプロフィール画像に入れる絵文字
    'link_names': 1, # メンションを有効にする
}))

これは/home/ec2-user/slack.pyにおいておきます。
cronがrootユーザーとして実行させることにするので、実行権限を付与しておきます。
$ sudo chmod 755 /home/ec2-user/slack.py

cron設定

続いて$ sudo vi /etc/cron.d/slack.py

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# 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
  * * * * *  root /usr/bin/python36 /home/ec2-user/slack.py

これだでけOKです。
特にcronのrestartとかいらないです。
これで1分ごとにslack通知が流れてきました~

cron.hourly配下

cron化させるslack通知pythonスクリプト

こちらは同じものを使っていきます。 配置場所も同じく/home/ec2-user/slack.pyです。

import requests
import json

webhook_url = "https://XXXXXXXXXXXXXX"
requests.post(webhook_url, data = json.dumps({
    'text': u'Test', # 投稿するテキスト
    'username': u'me', # 投稿のユーザー名
    'icon_emoji': u':ghost:', # 投稿のプロフィール画像に入れる絵文字
    'link_names': 1, # メンションを有効にする
}))

cron設定

$ sudo vi /etc/cron.hourly/slackを作成します。
ファイルの中身は以下です。

#!/bin/sh

/usr/bin/python36 /home/ec2-user/slack.py

ここで罠なのですが、このファイル自体にも実行権限を与えないと動かないみたいです。
$ sudo chmod 755 /etc/cron.hourly/slack

hourlyなので、1時間に1回なのですが、確認のために最大1時間も待つなんてとんでもないです。
以下より、一時的に設定を変更します。

$ sudo vi /etc/cron.d/0hourly

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
30 * * * * root run-parts /etc/cron.hourly

今回は**:30のときに実行されるように変更しました。

実際通知が流れてきました。
成功です。