考虑一个超过 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
答案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