我正在管理一个由第三方在 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 语法
00 07 1 * *
(为 collect_sale_statistics.sh
设置的 cron 时间)正确表示“第 1 日 07:00”。00 07 * 1 *
,其中 crontab.guru 表示“在一月的 07:00”。 .
3.关于 cron 文件夹
我怀疑问题可能在于我将一个应该每月运行的命令放在一个文件夹中
/etc/cron.d/
,该文件夹应该专用于 cron 文件,其中应该包含每天运行的命令。
但是,同一个 cron 文件包含每周运行的命令,并且运行良好。
正如@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