我通常有几个问题,如何cron执行脚本,因为他们通常没有我的环境设置。是否有一种方法可以调用bash(?)以同样的方式cron,这样我就可以在安装它们之前测试脚本?


当前回答

取决于shell的账户

sudo su
env -i /bin/sh

or

sudo su
env -i /bin/bash --noprofile --norc

从http://matthew.mceachen.us/blog/howto -模拟- - cron -环境- 1018. - html

其他回答

取决于shell的账户

sudo su
env -i /bin/sh

or

sudo su
env -i /bin/bash --noprofile --norc

从http://matthew.mceachen.us/blog/howto -模拟- - cron -环境- 1018. - html

创建一个cron作业,运行env并将stdout重定向到一个文件。 使用该文件和“env -”一起创建与cron作业相同的环境。

默认情况下,cron使用您系统中的sh来执行它的作业。这可能是实际的Bourne shell或破折号,ash, ksh或bash(或另一个)符号链接到sh(并因此在POSIX模式下运行)。

最好的方法是确保您的脚本拥有它们需要的东西,并假设没有为它们提供任何东西。因此,您应该使用完整的目录规范并自己设置环境变量(如$PATH)。

六年后回答:环境不匹配问题是systemd“计时器”作为cron替代品解决的问题之一。无论您是从CLI还是通过cron运行systemd“service”,它都接收到完全相同的环境,从而避免了环境不匹配的问题。

导致cron任务在手动传递时失败的最常见问题是cron设置的限制性默认$PATH,在Ubuntu 16.04中是这样的:

"/usr/bin:/bin"

相比之下,systemd在Ubuntu 16.04上设置的默认$PATH是:

"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

因此,systemd计时器已经有更好的机会找到二进制文件,而不需要进一步的麻烦。

systemd计时器的缺点是,设置它们需要更多的时间。您首先创建一个“服务”文件来定义您想要运行的内容,然后创建一个“计时器”文件来定义运行它的时间表,最后“启用”计时器来激活它。

别忘了,因为cron的父进程是init,所以它运行的程序没有控制终端。你可以用这样的工具来模拟:

http://libslack.org/daemon/