cron で環境変数を読み込む

こんにちは。
株式会社アドグローブ ソリューション第一事業部の徳村です。

みなさんは cron で環境変数を読み込みたいと思ったことはありませんか?
cron は Linux で定期実行を行ってくれる便利な機能ですが、デフォルトでは最低限の環境変数しか読み込みません。
このため、手動での実行と同じようにコマンドを記述したら、思ったように動かない…となった経験がある方も多いのではないでしょうか。
また、コマンドの引数をベタ書きしなければならないなど、保守性に欠けてしまうということもあると思います。

今回は cron に予め設定した環境変数を読み込ませて、シェルスクリプトを定期実行します。

要点

  1. cron 実行ユーザの .bash_profile に、読み込みたい環境変数を設定する。
  2. シェルスクリプトの開始行に記述する shebang を #!/bin/bash -l とする。
  3. cron にシェルスクリプトを直接実行するよう記述する。

詳細

cron ジョブの実行時、デフォルトでは最小限の環境変数しか読み込みません。
このため、実行ファイルはフルパスで記述しなければならないなどの制約があります。

環境変数の設定

.bash_profile はログイン時にのみ読み込まれる設定ファイルです。
今回は Bash をログインシェルとして実行するため、このファイルに環境変数を記述しておく必要があります。

echo export {EnvName}={EnvValue} >> ~/.bash_profile

実行シェルの作成

cron で実行したいシェルスクリプトを Bash で実行するため、shebang(よく言われるおまじない)を記述します。
この時、-l オプションを同時に記載し、ログインシェルとして実行するよう指定します。

#!/bin/bash -l

また、ファイルを直接実行するため、実行権限を付与しておきます。

sudo chmod 744 {scriptFilePath}

cron ジョブの設定

cron で実行するコマンドとして、sh ファイルを記述します。

* * * * * /home/user/hoge.sh >>/home/user/log/hoge_$(date +\%Y\%m\%d).log
# end of crontab

※ cron のコマンド内で % を記述すると改行文字に置き換えられるため、エスケープが必要なことに注意。

これで環境変数が読み込まれた状態で、シェルスクリプトが定期実行されるようになります。


cron メモ

cron ジョブをファイルで登録する

基本的に cron は crontab コマンドで制御され、crontab ファイルとして管理されますが、cron をファイル毎に管理したい場合などもあると思います。
このとき、/etc/cron.d 下に cron ファイルを配置することで、任意のファイルから cron ジョブを登録することができます。

crontab とは書式が少し異なり、実行ユーザを追記する必要があるため注意してください。
ファイル名は任意で、拡張子は不要です。

* * * * * user /home/user/hoge.sh >>/home/user/log/hoge_$(date +\%Y\%m\%d).log
# end of cronfile

また、このディレクトリに配置する cron ファイルは以下の状態でなければなりません。

  • ファイルの所有者が root であること
  • 所有者以外の書き込み権限がないこと
sudo chown root:root /etc/cron.d/{cronfile}
sudo chmod 644 /etc/cron.d/{cronfile}

配置した後、cron をリロードすることで反映されます。

sudo service cron restart

Windows 上で作成した cron ファイルが動作しない

cron ファイルを Windows 上などで作成した場合、改行コードの問題で正常に動作しなくなることがあります。
そのため、改行コードを除去する必要があります。

sed -i 's/\r//' {cronfilePath}

エディタが VS Code の場合、改行コードの選択から LF を選択しておくことでも対応が可能です。

あとがき

先日、軽い気持ちでゲームサーバを再起動するスクリプトを作成し(とあるゲームがメモリ大食らいだったため)、その定期実行のために cron を利用しました。

業務で cron を弄らせてもらったこともあったため、スクリプトの呼び出しくらいすぐできるだろう、と高を括っていたのですが、設定値ベタ書きは嫌だ…!などと無駄に凝ろうとした結果、スクリプト本体よりも cron の設定の方が断然長く掛かってしまいました。しばらく cron はいいです。

参照


アドグローブでは、さまざまなポジションで一緒に働く仲間を募集しています!
詳細については下記からご確認ください。みなさまからのご応募お待ちしております。

採用情報