MST

星途 面试题库

面试题:Bash输入输出重定向高级场景处理

在一个复杂的Bash脚本场景中,有多个命令依次执行,且部分命令之间有管道连接。要求在不改变脚本核心逻辑的前提下,将所有命令的标准输出和标准错误输出分别记录到不同的日志文件中,同时保证日志文件记录的时间戳精确到毫秒,并且要能够处理日志文件大小达到10MB时进行自动切割,切割后的日志文件以日期和序号命名。请详细说明实现思路并给出关键代码片段。
32.0万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 记录时间戳:使用date +%Y%m%d%H%M%S%3N获取精确到毫秒的时间戳。
  2. 日志记录:通过重定向操作符>2>分别将标准输出和标准错误输出重定向到不同文件。
  3. 日志切割:利用logrotate工具,它是一个Linux系统下用于管理日志文件的工具,能够按指定条件切割日志。

关键代码片段

  1. Bash脚本中记录日志
#!/bin/bash

timestamp=$(date +%Y%m%d%H%M%S%3N)
stdout_log="stdout_${timestamp}.log"
stderr_log="stderr_${timestamp}.log"

command1 | command2 > >(tee -a $stdout_log) 2> >(tee -a $stderr_log >&2)
# 后续命令类似处理,例如
command3 > >(tee -a $stdout_log) 2> >(tee -a $stderr_log >&2)
  1. 配置logrotate: 创建一个logrotate配置文件,例如/etc/logrotate.d/your_script_logs,内容如下:
/path/to/stdout_*.log {
    size 10M
    missingok
    rotate 5
    compress
    delaycompress
    notifempty
    create 644 your_user your_group
    sharedscripts
    postrotate
        # 这里可能需要重新启动相关服务以通知其使用新的日志文件
        /bin/kill -HUP `cat /var/run/your_service.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

/path/to/stderr_*.log {
    size 10M
    missingok
    rotate 5
    compress
    delaycompress
    notifempty
    create 644 your_user your_group
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/your_service.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

上述配置中,size 10M表示日志文件达到10MB时进行切割,rotate 5表示保留5个旧的日志文件,compress表示压缩旧日志文件等。根据实际情况调整create中的用户和组以及postrotate中的服务重启命令。