nohup脚本跨日期统计日志行数异常:命令行有效后台执行无效
问题解决:nohup后台脚本中统计指定日期日志行数失效
场景与问题
需求是为nohup运行的脚本实现次日自动创建新日志文件,当前阶段需要在跨日期切换时统计次日的日志行数。示例日志内容如下:
script.ksh 2024/02/19 23:59:59
script.ksh 2024/02/20 00:00:00
script.ksh 2024/02/20 00:00:01
遇到的问题:命令行执行以下命令能正常得到匹配2024/02/20的日志行数,但将这些命令放入nohup后台运行的脚本中时,无法输出预期结果:
grep -E '2024/02/20' | wc -l sed -n '\#2024/02/20 00:00:0#, \2024/02/20 00:00:0#p'| wc -l
问题原因
- grep命令缺少输入源:命令行中你大概率是通过管道(比如
cat script.log | grep ...)或重定向给grep提供了日志内容,但脚本中如果没有明确指定日志文件或输入流,grep会一直等待标准输入,后台运行时无输入则不会执行。 - sed命令语法错误:范围匹配的结束模式使用了
\2024,这里的反斜杠会将2视为转义字符,导致模式匹配失败;同时结束模式的内容重复了00:00:0,逻辑上也不完整。
修正方案
方案1:修复grep命令(明确指定日志文件)
如果日志文件路径为/path/to/script.log,直接在脚本中使用绝对路径指定输入源:
grep -E '2024/02/20' /path/to/script.log | wc -l
若日志是脚本自身的输出,确保nohup启动时正确重定向输出:
nohup ./your_script.ksh > /path/to/script.log 2>&1 &
方案2:修复sed命令语法
将sed的范围匹配分隔符统一,修正模式内容:
- 匹配2024/02/20的所有行:
sed -n '\#2024/02/20#p' /path/to/script.log | wc -l
- 精确匹配2024/02/20当天0点到23:59:59的行:
sed -n '\#2024/02/20 00:00:00#,\#2024/02/20 23:59:59#p' /path/to/script.log | wc -l
额外注意事项
- nohup后台运行时,脚本的工作目录可能与命令行不一致,必须使用日志文件的绝对路径,避免因找不到文件导致统计失败。
- 若需实时统计日志,可结合
tail -f,但跨天统计时更建议在切换日志文件的时机,读取已完成的旧日志文件进行统计,避免缓冲导致的行数不准。
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

