MST

星途 面试题库

面试题:Bash脚本日志记录的并发处理与高效存储

假设你有一个Bash脚本,它会并发执行多个子任务(可以使用`&`符号实现并发),每个子任务都有自己的输出。请设计一个方案,将这些并发子任务的输出有效地记录到日志文件中,确保日志记录的准确性和高效性,同时要考虑日志文件的滚动策略,例如当日志文件大小达到10MB时进行切割。
21.3万 热度难度
编程语言Bash

知识考点

AI 面试

面试题答案

一键面试
  1. 并发子任务输出记录到日志文件

    • 使用tee命令结合&>操作符来将子任务的标准输出和标准错误输出同时记录到日志文件中。假设脚本如下:
    #!/bin/bash
    
    log_file="your_log_file.log"
    
    task1() {
        echo "Task 1 output"
        sleep 2
    }
    
    task2() {
        echo "Task 2 output"
        sleep 3
    }
    
    task1 &> >(tee -a $log_file) &
    task2 &> >(tee -a $log_file) &
    
    wait
    
    • 这里&> >(tee -a $log_file)将任务的标准输出和标准错误输出重定向到tee -a $log_filetee -a会将输出追加到日志文件中,并且同时输出到终端(如果需要在终端也看到输出的话)。
  2. 日志文件滚动策略

    • 可以使用logrotate工具来实现日志文件的滚动。首先,创建一个logrotate的配置文件,例如/etc/logrotate.d/your_script_log,内容如下:
    /path/to/your_log_file.log {
        size 10M
        missingok
        rotate 5
        compress
        delaycompress
        notifempty
        create 644 your_user your_group
        sharedscripts
        postrotate
            /bin/kill -HUP `cat /var/run/your_script.pid 2>/dev/null` 2>/dev/null || true
        endscript
    }
    
    • 解释:
      • size 10M:当日志文件大小达到10MB时进行切割。
      • missingok:如果日志文件不存在,不报错。
      • rotate 5:保留5个旧的日志文件。
      • compress:压缩旧的日志文件。
      • delaycompress:下一次滚动时压缩上一次滚动的日志文件。
      • notifempty:如果日志文件为空,不进行滚动。
      • create 644 your_user your_group:滚动后创建新的日志文件,权限为644,所有者为your_user,所属组为your_group
      • sharedscripts:只在所有日志文件都滚动后执行一次脚本。
      • postrotateendscript之间的脚本在日志文件滚动后执行,这里以向进程发送HUP信号为例(假设进程将PID写入/var/run/your_script.pid),让进程重新打开日志文件进行写入。如果你的脚本没有使用PID文件,可以省略这部分内容。

这样就可以有效地将并发子任务的输出记录到日志文件中,并实现日志文件的滚动策略。