如何才能依次执行crontab里的所有命令呢?

如何才能依次执行crontab里的所有命令呢?

考虑一个超过 100 行的复杂 crontab,其中随后运行许多脚本来轮询和处理来自不同客户端的消息。

重新启动服务器后,我会触发一些最重要的客户端的脚本立即运行(复制/粘贴)。

但是,使用一行代码来处理所有 crontab 条目将会有很大帮助。

所有脚本都位于 /opt/ 中,因此所有行看起来都像这样:

m h  dom mon dow     /opt/XXXXXX/YYYYY/ZZZZZ.sh >/dev/null 2>&1

在 m, h & dow 中有时也使用 "/" & "-",fe :

*/3 5-21 * * 1-5     /opt/XXXXXX/YYYYY/ZZZZZ.sh >/dev/null 2>&1
*/5 0-1,5-23 * * *   /opt/XXXXXX/YYYYY/ZZZZZ.sh >/dev/null 2>&1
25 2 * * 7           /opt/XXXXXX/YYYYY/ZZZZZ.sh >/dev/null 2>&1

crontab -l | grep -v "#" | wc -l
129

短暂性脑缺血
发作

答案1

您的问题中已经有了答案的要素。

如果您将crontab行修改为:

crontab -l | grep -v "#" | grep -o '/opt/.*$' > cron.tmp

然后cron.tmp将包含您需要运行的所有命令。您可以使用 来按原样运行它. ./cron.tmp,也可以将其设为可执行文件并直接使用 来运行它chmod +x cron.tmp && ./cron.tmp

如果您想避免临时文件,您可以使用:

crontab -l | grep -v "#" | grep -o '/opt/.*$' | while read l; do eval $l; done

您需要使用eval以便命令中的重定向能够起作用。

请注意,您可以将两次grep运行合并为一次sed替换:

crontab -l | sed -n 's=^[^#]*\(/opt/.*$\)=\1=p' | while read l; do echo eval $l; done

答案2

也许你正在寻找run-parts 命令,它以目录作为参数并将运行该目录下的每个可执行文件或脚本。

例如 :

run-parts /etc/cron.daily

答案3

但是,使用一行代码来处理所有 crontab 条目将会有很大帮助。

编写一个执行此操作的脚本,然后从 调用cron@reboot

#!/bin/bash
for script in /opt/XXXXXX/YYYYY/*.sh; do
 $script
 done

如果您必须递归目录:

#!/bin/bash
find /opt/XXXXXX/ -name '*.sh' -type f -exec '{}' \;

您只想运行某些脚本,但是却有很多?

对每个这样的脚本执行此操作:

ln -s /opt/XXXXXX/YYYYY/whatever.sh /opt/run-at-reboot/

然后从 调用cron@reboot

#!/bin/bash
for script in /opt/run-at-reboot/*.sh; do
 $script
 done

相关内容