web-dev-qa-db-ja.com

cron ENVがユーザーのENVと異なるのはなぜですか?

Ubuntuの新規インストールでは、ユーザーのPATHは次のとおりです。

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

しかし、同じユーザーのcron環境では、次のようになります。

/usr/bin:/bin

ホームディレクトリにあるすべてのユーザーのドットファイルを調べましたが、PATHを変更しているものはありません。

PATHの変更点は何ですか? cronがそのPATHを使用しないのはなぜですか?

3
John Bachir

質問(なぜそうなのか)に関しては、それを説明するマニュアルページはcrontab(5)であり、IOWはman 5 crontabからアクセスできます(セクション1のデフォルトではありません)。 cronデーモンはシェルセッションをエミュレートしようとせず、cronジョブを実行するためのクリーンで最小限の環境をセットアップし、次にcrontabファイルが独自の任意の環境変数を設定できるようにします。 Debianに同梱されている新しいcronデーモンには、pam_envなどの追加のプロビジョニングもいくつかあります。

3
Josip Rodin

Cronはログインシェルでプロセスを実行しません。このため、プロセスの実行時にすべての一般的なスクリプトが提供されるわけではありません。

ログインシェル内からプロセスを実行すると、ユーザーの環境が複製されます。

このようなものをcrontabに入れて、2つの出力を比較します。

*/1 * * * * /usr/bin/env > /tmp/env                                             
*/1 * * * * /usr/bin/bash -l -c /usr/bin/env > /tmp/bashenv  

ご覧のとおり、/tmp/bashenvには、/tmp/envにはない環境変数が多数含まれています。これは、envbash -lを使用してログインシェルで呼び出されたためです。

2
Mike Shoup