updatedb 的 cron 作业未运行,因为当时系统已关闭。我想告诉 cron 现在运行该作业,就好像现在是计划时间一样。有办法吗?
对于这个作业,我不想在前台运行它,因为我不想让它保持打开状态,也不想在屏幕上运行它,因为我不想稍后清理它。在许多其他场合,做同样的事情来测试作业是否会在 cron 提供的环境中正确执行会很有用。
答案1
cron 使用的环境在 /etc/crontab 中定义
您可以使用该文件运行命令来设置环境,例如:
env - `cat /etc/crontab | grep -v "#" | grep -v "^$" | grep -v /etc/cron` your_script_name.sh
这会删除注释(以 # 开头的行)、空白行(匹配正则表达式:^$)以及系统范围的 crontab 条目本身,只留下环境变量。这些变量用于通过“env”命令在修改后的环境中运行脚本。
如果您想要让该进程在后台运行,可以使用 nohup 来实现:
nohup 'env - `cat /etc/crontab | grep -v "#" | grep -v "^$" | grep -v /etc/cron` your_script_name.sh' &
解决方案取自: http://benohead.com/linux-simulate-the-cron-environment-to-test-run-your-scripts/
答案2
关于什么
nohup updatedb &
在终端(xterm 或控制台)中执行?
答案3
我曾经创建过一个 Bash 脚本,其中包含用于测试手动运行和已知错过的运行的逻辑。它利用简单的文件存在来工作,有点像 LOCK 文件的反向操作。
为了使其正常工作,脚本由 2 个部分或例程组成。我们的 cron 设计为在中午或午夜每 12 小时运行一次,但您可以将此逻辑应用于任何时间表。
代码的 A 部分,检查是否是中午或午夜,如果是,则触碰文件:touch ./RUNCRON
代码的 B 部分,检查是否存在./RUNCRON
。然后,将原始 cron 作业的代码插入为 IF 的 THEN 主体,作为最后一条语句,我们删除了文件./RUNCRON
新的 cron 作业设置为每分钟执行一次,而不是每 12 小时执行一次。要触发手动运行,我们只需touch ~/path/to/RUNCRON
答案4
您可以使用at
非交互方式运行命令:
at now + 1 min
at> /command/to/run
at> ^D
job 2 at Wed Jul 30 14:27:00 2014
“现在 + 1 分钟”表示在一分钟后运行该命令。at
将提示您输入要运行的命令;完成后按 Cntrl-D。at
将在与交互式会话相同的当前目录中并使用相同的环境变量运行命令。