1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

なぜ cron だと動かないの?!〜記憶喪失の執事と環境変数の罠〜

1
Posted at

はじめに

「手動で叩くと完璧に動くのに、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が、急に健気な存在に見えてきました。彼はサボっていたのではなく、彼なりの真面目さで「指定された通りに(ただし最小限の知識で)」動こうとしていただけでした。フルパスで指示を書く手間は、彼への愛情の裏返しです。今日も定時に動いてくれて、ありがとう執事!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?