为什么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 ? 为什么不使用该PATH

关于这个问题 – 为什么这样 – 解释它的手册页是crontab(5) ,IOW可以通过man 5 crontab访问(不是第一部分的默认选项)。 cron守护进程不会尝试模拟一个shell会话,而是为cron作业运行设置一个干净的,最小的环境,然后允许crontab文件设置自己的任意环境variables。 Debian附带的更新的cron守护进程还有一些额外的pam_env等。

Cron不会在loginshell中执行进程。 因此,执行进程时,所有典型的脚本都不会被采集。

从loginshell执行进程应该复制用户的环境。

把这样的东西放在一个crontab中,比较两个输出:

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

正如你所看到的, /tmp/bashenv将会有一大堆/tmp/env没有的环境variables。 这是因为env是使用bash -l在loginshell中调用的。