Crontab 設定の罠

takahashi 著者:takahashi

Crontab 設定の罠

Let’s Encryptで月に1回証明書を強制的に更新するようにcronにスクリプトを設定してあったはずなのに、Let’s Encryptから有効期限の警告メールが送られてきました。

あれ…と思い、crontabに登録されているコマンドを手動で実行すると正常に更新ができる状態。

そこでLet’s Encryptの更新ログを確認してみると…

2019-08-01 03:45:46,218:INFO:certbot.main:Could not choose appropriate plugin: The nginx plugin is not working; there may be problems with your existing configuration.
The error was: NoInstallationError("Could not find a usable 'nginx' binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.",)
2019-08-01 03:45:46,219:WARNING:certbot.renewal:Attempting to renew cert (example.jp) from /etc/letsencrypt/renewal/example.jp.conf produced an unexpected error: The nginx plugin is not working; there may be problems with your existing configuration.
The error was: NoInstallationError("Could not find a usable 'nginx' binary. Ensure nginx exists, the binary is executable, and your PATH is set correctly.",). Skipping.

なにやらNginxのバイナリが見つからないというメッセージが。

このサーバーではWebサーバーにNginxを使用しているため、Let’s Encryptのnginxプラグインを使用しているのですが、勿論Nginxはインストール済みですし、パッケージでインストールしたのでシステム上はパスが通っている状態でした。

ということは、もしかしてCronのパス設定がおかしいのか…と考えて “/etc/crontab”の設定を確認したものの

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

あれ…設定はちゃんと入っている…

念のため、Let’s Encryptの更新に使用しているrootユーザーのcrontabに次の一行を入れて、本当に上記のパス設定が効いているのか確認してみました。

* * * * * echo $PATH > /tmp/cronpath.log 2>&1

すると

/usr/bin:/bin

アレ…

設定してあったはずのパスよりも全然少ない…

その後確認したところ、どうやらユーザーごとのcrontabについては/etc/cronの指定は無効なようで、ユーザーごとのcronでも先頭にPATHを追加する必要があるようです。

ということで、

sudo crontab -e

としてrootのcrontabを開いた後、次の2行を一番最初に追記します。

SHELL=/bin/bash #cronで使用したいシェル
PATH=/sbin:/bin:/usr/sbin:/usr/bin #cron実行時に通しておきたいpath

この状態で再度確認すると

/sbin:/bin:/usr/sbin:/usr/bin

ちゃんとパスが更新されました!

Let’s Encryptもcron経由で試しましたが、無事動作しました。

まさかPathだったとは…

  • この記事いいね! (0)

著者について

takahashi

takahashi administrator

Webエンジニア。 趣味で自宅サーバーを稼働中。 ファンタジーが好き。