今回はcronとcrontabコマンドについてです。
- ■cron(クーロン)とは?
- ■crontabコマンドとは?
- ■crontabコマンド実行後のcronエントリの書式について
- ■cronの設定ファイルの場所は?
- ■/var/spool/cronディレクトリの権限について
- ■cronエントリの実行ユーザについて
- ■crontabコマンドの権限について1
- ■crontabコマンドの権限について2
- ■cron実行のログはどこ?
本記事は以下の本を参考にしております。
■cron(クーロン)とは?
詳細は割愛しますが、「定期実行する処理を管理しているデーモン」です。
ざっくりいうと、"何月何日の何時何分に特定コマンドを実行したい"のようなときにcronを使うと実現できます。
■crontabコマンドとは?
cronを設定する際に利用するコマンドです。こちらも詳細は割愛します。
【書式】
crontab [ -u user ] [-l | -e | -r]
【例:user1のcron情報を表示】
crontab -u user1 -l
【例:user1のcron情報を更新】
crontab -u user1 -e
【例:user1のcron情報を削除】
crontab -u user1 -r
【例:rootのcron情報を表示】
crontab -u root -r
【例:ログイン中ユーザのcron情報を表示】
crontab -l
■crontabコマンド実行後のcronエントリの書式について
上記のような書式です。
これを「cronエントリ」と言ったりします。
空白が区切り文字です。
各カラムは以下の意味を持ちます。
上記の画像の通り「* * * * * echo "test" > /dev/null」であれば、
1分ごとにecho "test" > /dev/null コマンドを実行する、という意味です。
■cronの設定ファイルの場所は?
/var/spool/cron配下にあります。
例えば、私の環境では、rootユーザ/test2ユーザ/testuserユーザでcronエントリを登録している為、以下のような表示となります。
これらのファイルは各ユーザ専用として存在しております。
ここまでは、検索し易いので情報を見つけやすいと思います。
ここから先は、ちょっと踏み込んで権限周り等を意識してみたいと思います。
■/var/spool/cronディレクトリの権限について
デフォルトでは「所有者root、所有グループroot、権限700」のため、
/var/spool/cron/配下のファイルについては、一般ユーザによる表示/書き込みはできません。
つまり、ls /var/spool/cron/ とか echo "#test" > /var/spool/cron/test2 とかはコマンドが通りません。以下のようなエラーが表示されます。
■cronエントリの実行ユーザについて
cronエントリ内に実行ユーザを記載しない限り、ファイル名のユーザにて実行されます。
例えば、test2ファイル内のcronエントリは常にtest2ユーザとして実行されます。
ちなみに、/var/spool/cron/test2ファイルの所有者/所有グループをrootに変更した場合もtest2ユーザとして実行されます。
そのため、仮に下記のようにrootを所有者/所有グループに設定したところで、
実行ユーザは各ユーザ(test2ファイルならtest2ユーザ、testuserファイルならtestuserユーザ)です。
■crontabコマンドの権限について1
上記の通り、SUID(所有者権限がrws。セットユーザID)のため、
一般ユーザでcrontabコマンドを実行しても、権限はrootとして実行されることになります。
これにより、各ユーザでcrontabコマンドが実行することができ、
/var/spool/cron/配下の各ユーザのファイルが更新できる仕様です。
■crontabコマンドの権限について2
少し注意というか、知っておいた方が良いこととしては、
/var/spool/cron/配下ファイルの権限や所有者/所有グループは、
「あまり役に立たない」ということです。
どういうことかと言うと、
下記のように所有者、所有グループ、権限がそれぞれのユーザで設定されており、権限が所有者(700)であろうとも、
crontabコマンドの実行が可能であれば、各ユーザはcronエントリを変更することができるということです。
そのため、どんなに権限を厳しくしてもcrontabコマンドが実行できてしまえば、変更は容易ということになります。
■cron実行のログはどこ?
デフォルトでは、/var/log/cron内にログが記載されます。
下記のような感じです。
上記のように、()内に実行ユーザ名が記載されます。
上記ログは、下記権限時のものです。
(念のためですが、仮に全てのファイルの所有者/所有グループがrootであっても、各ユーザで実行されます。)
尚、journalctlコマンドでも確認できますが、/var/log/cronと違い、どのようなcronエントリが実行されたのかがわからないです。
※出力方法もあるかもしれませんが、追求してないです。
以上です。
本記事は以下の本を参考にしております。