面试题答案
一键面试-
并发子任务输出记录到日志文件:
- 使用
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_file
,tee -a
会将输出追加到日志文件中,并且同时输出到终端(如果需要在终端也看到输出的话)。
- 使用
-
日志文件滚动策略:
- 可以使用
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
:只在所有日志文件都滚动后执行一次脚本。postrotate
和endscript
之间的脚本在日志文件滚动后执行,这里以向进程发送HUP
信号为例(假设进程将PID写入/var/run/your_script.pid
),让进程重新打开日志文件进行写入。如果你的脚本没有使用PID文件,可以省略这部分内容。
- 可以使用
这样就可以有效地将并发子任务的输出记录到日志文件中,并实现日志文件的滚动策略。