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


当前回答

回答https://stackoverflow.com/a/2546509/5593430展示了如何获取cron环境并将其用于您的脚本。但是请注意,环境会因所使用的crontab文件而有所不同。我创建了三个不同的cron条目,通过env >日志保存环境。这些是在Amazon Linux 4.4.35-33.55.amzn1.x86_64上的结果。

1. 使用root用户创建全局/etc/crontab

MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PWD=/
LANG=en_US.UTF-8
SHLVL=1
HOME=/
LOGNAME=root
_=/bin/env

2. root用户crontab (crontab -e)

SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
PWD=/root
LANG=en_US.UTF-8
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env

3./etc/cron.hour /脚本

MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
_=/bin/env
PWD=/
LANG=en_US.UTF-8
SHLVL=3
HOME=/
LOGNAME=root

最重要的是PATH, PWD和HOME不同。确保在cron脚本中设置这些以依赖稳定的环境。

其他回答

在我的例子中,cron正在使用sh执行我的脚本,它不能执行一些bash语法。 在我的脚本中,我添加了env变量SHELL:

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

取决于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作业的唯一方法是设置它在未来运行一到两分钟,然后等待。

六年后回答:环境不匹配问题是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默认只提供这个环境:

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

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