为什么我的 cron 文件中的每月命令不起作用,而每日命令却起作用?

问题描述 投票:0回答:1

我正在管理一个由第三方在 Ubuntu 操作系统上构建的系统。

cron 文件中有一行 - 每月第一天的 07:00 - 应该触发一个 bash 脚本,该脚本调用 ansible playbook,并生成包含执行信息的日志。

调用链:

cron 文件 -> bash 脚本 -> ansible playbook

但是这不起作用:脚本不运行,日志不生成。

有什么问题吗?

背景

cron 文件是

/etc/cron.d/ansible-cron
,案例行是

00 07 1 * * myuser /home/myuser/var/myfolder/ansible-am/collect_sale_statistics.sh >/home/myuser/var/log/collect_sale_statistics-$(date +\%Y-%m).log 2>&1

bash 脚本权限是

-rwxr-xr-x 1 myuser myuser 493 Mar 23 17:42 collect_sale_statistics.sh*

其内容是

#!/bin/bash

cd /home/myuser/var/myfolder/ansible-am
/home/myuser/var/myfolder/ansible-venv/bin/ansible-playbook playbooks/collect_sale_statistics/main.yml

在我的机器中,对一些成功运行的每日和每周剧本实施了相同的例程。

例如

cron

/etc/cron.d/ansible-cron
还包含:

# collect number of reboot in the last week every monday
00 07 * * 1 myuser /home/myuser/var/myfolder/ansible-am/count_reboots.sh >/home/myuser/var/log/count_reboots-$(date +\%w).log 2>&1

bash 脚本权限是

-rwxr-xr-x 1 myuser myuser 771 Feb  8  2023 /home/myuser/var/myfolder/ansible-am/count_reboots.sh*

其内容是

#!/bin/bash

cd /home/myuser/var/myfolder/ansible-am
/home/myuser/var/myfolder/ansible-venv/bin/ansible-playbook playbooks/count_reboots.yml

脚本

count_reboots.sh
运行正常,生成日志等

错误分析

1。关于错误位置

我看到的是日志没有生成,所以我猜测进程在 cron 中的命令执行之前或之前中断。
所以问题肯定出在cron上。
当然,它不在 ansible 剧本中。

如果我在终端手动运行

bash /home/myuser/var/myfolder/ansible-am/collect_sale_statistics.sh

脚本运行正常,只是应该由 cron 触发的自动执行没有启动。

所以我猜问题出在 cron 文件和 bash 脚本的可访问性之间。

2。关于 cron 语法

我已在 crontab.guru 上验证,

00 07 1 * *
(为
collect_sale_statistics.sh
设置的 cron 时间)正确表示“第 1 日 07:00”。
该消息有点不清楚,因为“day-of-month 1”可以解释为“day-of-month1”,即一月,所以“一月的每一天”。
然而,事实并非如此,因为我也在 crontab.guru 上验证过,“一月的每一天”都被 cron 转码为
00 07 * 1 *
,其中 crontab.guru 表示“在一月的 07:00”。 .

3.关于 cron 文件夹

我怀疑问题可能在于我将一个应该每月运行的命令放在一个文件夹中

/etc/cron.d/
,该文件夹应该专用于 cron 文件,其中应该包含每天运行的命令。

但是,同一个 cron 文件包含每周运行的命令,并且运行良好。

bash ubuntu cron
1个回答
0
投票

正如@GordonDavisson 和另一个SO线程所引用的,cron 的手册页文档说:

...
Percent-signs (%) in the command, unless escaped with backslash (\), 
will be changed into newline characters, and all data after the 
first % will be sent to the command  as standard input.
...

所以我的台词

00 07 1 * * myuser /home/myuser/var/myfolder/ansible-am/collect_sale_statistics.sh >/home/myuser/var/log/collect_sale_statistics-$(date +\%Y-%m).log 2>&1

会导致

00 07 1 * * myuser /home/myuser/var/myfolder/ansible-am/collect_sale_statistics.sh >/home/myuser/var/log/collect_sale_statistics-$(date +\%Y-
# new line
m).log 2>&1

并破坏 cron 文件。

在上面的第一行中,我在月份变量的百分号(

\
)之前添加了一个转义(
%m
)字符,所以现在是

00 07 1 * * myuser /home/myuser/var/myfolder/ansible-am/collect_sale_statistics.sh >/home/myuser/var/log/collect_sale_statistics-$(date +\%Y-\%m).log 2>&1
© www.soinside.com 2019 - 2024. All rights reserved.