Cron 不使用其 crontab 所在用户的路径,而是拥有自己的路径。可以通过PATH=/foo/bar在 crontab 的开头添加来轻松更改,经典的解决方法是始终使用 cron 运行的命令的绝对路径,但是 cron 的默认 PATH 在哪里定义的?
我在我的 Arch 系统(cronie 1.5.1-1)上创建了一个包含以下内容的 crontab,并在 Ubuntu 16.04.3 LTS 机器上进行了测试,结果相同:
$ crontab -l
* * * * * echo "$PATH" > /home/terdon/fff
Run Code Online (Sandbox Code Playgroud)
打印出来的:
$ cat fff
/usr/bin:/bin
Run Code Online (Sandbox Code Playgroud)
但为什么?默认的系统范围路径设置在 中/etc/profile,但包括其他目录:
$ grep PATH= /etc/profile
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
Run Code Online (Sandbox Code Playgroud)
/etc/environmentor 中没有其他相关内容,/etc/profile.d我认为其他文件可能会被 cron 读取:
$ grep PATH= /etc/profile.d/* /etc/environment
/etc/profile.d/jre.sh:export PATH=${PATH}:/usr/lib/jvm/default/bin
/etc/profile.d/mozilla-common.sh:export MOZ_PLUGIN_PATH="/usr/lib/mozilla/plugins"
/etc/profile.d/perlbin.sh:[ -d /usr/bin/site_perl ] && PATH=$PATH:/usr/bin/site_perl
/etc/profile.d/perlbin.sh:[ -d /usr/lib/perl5/site_perl/bin ] && PATH=$PATH:/usr/lib/perl5/site_perl/bin
/etc/profile.d/perlbin.sh:[ -d /usr/bin/vendor_perl …Run Code Online (Sandbox Code Playgroud)