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


当前回答

你可以运行:

env - your_command arguments

这将在空环境下运行your_command。

其他回答

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

http://libslack.org/daemon/

我不相信有;我所知道的测试cron作业的唯一方法是设置它在未来运行一到两分钟,然后等待。

Cron默认只提供这个环境:

HOME用户的主目录 LOGNAME用户登录名 路径= / usr / bin: / usr / sbin SHELL = / usr / bin / sh

如果需要更多,可以在crontab中的调度表之前定义环境。

六年后回答:环境不匹配问题是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正在使用sh执行我的脚本,它不能执行一些bash语法。 在我的脚本中,我添加了env变量SHELL:

#!/bin/bash
SHELL=/bin/bash