はじめに
「手動で叩くと完璧に動くのに、cronに登録した途端に動かなくなる現象、なんなの!?」
深夜に実行されるはずのバックアップスクリプト。朝起きて確認すると、ログが空っぽ。焦って手動で ./backup.sh を叩くと普通に動く。
「cronの野郎、俺のスクリプトをサボりやがったな!」とキレていたあの頃の私へ。悪いのはcronではありません、あなたの「伝え方」です。
cronは「記憶喪失の超マジメな執事」
普段あなたがターミナルにログインした時、裏側で ~/.bashrc や ~/.bash_profile が読み込まれています。これによって、「python と言われたら /usr/bin/python3 のことだな」という暗黙の了解(環境変数PATH)が形成されています。
しかし、cronはログインというステップを踏まず、常にまっさらな「記憶喪失の執事」として起床します。
彼にいきなり python backup.py と指示しても、「はて?pythonとは誰のことでございましょう?」とエラーを吐いて倒れてしまうのです。
執事には「フルパス」で絶対に迷わない指示を
記憶喪失の執事に確実に仕事をさせるには、「暗黙の了解」を排除し、「誰が(コマンド)」「どこにある(ファイル)」をフルパスで指示する必要があります。
❌ ダメな書き方(cronが理解できない)
0 3 * * * python backup.py
⭕ 正解の書き方(フルパスの徹底)
# pythonのフルパスと、スクリプトのフルパスを明記する
0 3 * * * /usr/bin/python3 /home/user/scripts/backup.py
もしくは、cronの設定の一番上に PATH=/usr/bin:/bin:... と教えてあげるのも手です。
cronへの愛着が湧く瞬間
「cronは環境変数を引き継がない」という事実を知った時、ずっと憎たらしかったcronが、急に健気な存在に見えてきました。彼はサボっていたのではなく、彼なりの真面目さで「指定された通りに(ただし最小限の知識で)」動こうとしていただけでした。フルパスで指示を書く手間は、彼への愛情の裏返しです。今日も定時に動いてくれて、ありがとう執事!