如何在crontab中运行tail与grep?终端可用定时任务失效排查
Crontab任务不生效的问题解决
你的crontab命令无法生效主要是以下几个问题导致的,对应解决方法如下:
命令逻辑顺序错误
原命令里的管道方向完全搞反了:你现在是让tail等待输入,再把结果传给grep去匹配不存在的文件参数。正确逻辑是先对所有日志文件提取最后10行,再过滤包含"Error"的行,修正后的命令结构应为:tail -n 10 **/*.log | grep -w "Error"Crontab默认Shell不支持递归Glob匹配
crontab默认使用sh作为执行Shell,而sh不支持**/*.log这种递归匹配子目录文件的语法。有两种解决方式:- 在crontab最顶部添加一行,指定使用bash执行:
SHELL=/bin/bash - 改用
find命令替代glob匹配,兼容性更强:find /Users/nassim/Desktop/application1 -type f -name "*.log" -exec tail -n 10 {} \;
- 在crontab最顶部添加一行,指定使用bash执行:
输出文件路径不明确
直接写error.txt会让crontab将文件输出到用户家目录(比如/Users/nassim/),而非你期望的application1目录。建议用绝对路径指定输出位置:> /Users/nassim/Desktop/application1/error.txt可选:使用绝对路径调用命令
避免crontab的PATH环境变量缺失导致命令找不到,可以给tail、grep等命令加上绝对路径,比如/usr/bin/tail、/usr/bin/grep。
最终可用的crontab命令示例
方式一(指定bash使用递归匹配)
SHELL=/bin/bash * * * * * cd /Users/nassim/Desktop/application1 && /usr/bin/tail -n 10 **/*.log | /usr/bin/grep -w "Error" > ./error.txt
方式二(用find命令,无需指定bash)
* * * * * /usr/bin/find /Users/nassim/Desktop/application1 -type f -name "*.log" -exec /usr/bin/tail -n 10 {} \; | /usr/bin/grep -w "Error" > /Users/nassim/Desktop/application1/error.txt
内容的提问来源于stack exchange,提问作者user20598687
相关产品推荐
相关产品推荐

