cronを初めて使用した際、パスが通っていなくて時間をかけてしまったのでここに書いておきます。結論からいうと、cronは環境変数のパスが通っていないため、crontabファイルの最初に必要なパスを通しておこう、という話です。
実行環境
- CentOS7
- ユーザー名: test
cronについて
cronはコマンドの実行スケジュール管理プロセスで、crondデーモンで管理します。
cronの使い方
cronの起動
crondを起動させます。 通常最初から動いているはずですが、もし動いていない場合は、CentOS7以降ならsystemdでcrondを起動させます。
1 2 3 |
# systemctl start crond # systemctl enable crond |
cronの設定ファイル
- /etc/crontab すべてのユーザーの自動タスクを管理している。
- /var/spool/cron/ このディレクトリの下に各ユーザーごとの設定ファイルがあります。例えば今回の実験ユーザーは"test"なので、/var/spool/cron/testファイルが設定ファイルになります。
cronの実行
/var/spool/cron/testファイルに実行したいタスクとスケジュールを書き込めばよいのですが、直接はroot権限でしか書き込めないので、一般にはいったんcron.tabというファイルを作ってそれを上のファイルとしてコピーします。
書き方としては、
1 2 |
分 時 日 月 曜日 コマンド |
と記述します。例えば
1 2 3 |
# vi cron.tab 0 0 * * * python test.py |
とすれば、毎日0時0分にtest.pyというファイルをpythonで実行させます。*はすべてのという意味で、毎日や毎月指定するときに使用します。
このファイルをcronに実行させるためには、
1 2 |
crontab < cron.tab |
とすれば良いです。
cronのパス設定
1 2 3 4 5 |
# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root |
/etc/crontab内には上のように実行シェルとパス等の環境変数が設定されています。cronで使用するプログラムがこのパス内に含まれている場合は問題ないのですが、例えばpython2が初期で入っている環境でpython3を入れた場合、そのインタープリターは/usr/local/bin/内に置かれるので、python3のプログラムをcronで実行することができません。cronを設定するユーザーの環境変数が、そのままcronには反映されないのが注意点です。解決策は2つあります。
/etc/crontab設定ファイルを変更
1つ目はこの/etc/crontabファイル内の初期設定のPATH変数を書き換えてしまうことです。例えばcronで/usr/local/bin内のプログラムを使いたい場合は、/etc/crontabファイル内で先ほどのPATH変数を
1 2 |
PATH=/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin |
と書き換えれば、プログラムを使うことができます。
ただし、このファイルを書き換えるとすべてのユーザーのPATH設定が変わってしまうため、マルチユーザーでcronを使っている場合は注意しましょう。
/var/spool/cron/ユーザー名
ユーザーごとにcronのパスを通したい場合はこのファイルで設定します。一般に直接このファイルは触れないので、cron.tabというファイルに実行スケジュールを書き込むとすると、
1 2 3 4 5 |
# vi cron.tab PATH=/usr/local/bin:$PATH 0 0 * * * python test.py # crontab < cron.tab |
とすれば/usr/local/binのパスを通した状態でcronにプログラムを実行させることができました。
まとめ
cron実行時に必要なパスを通す方法をまとめると、
- "/etc/crontab"ファイル内のPATH変数を書き換える
- "/var/spool/cron/ユーザー名"ファイルの最初にPATH変数を設定する
となります。
コメント