编写Bash脚本:将进程输出延迟几秒后从终端重定向至文件
解决方法:控制后台进程的输出重定向时机
你的示例代码存在两个关键问题:
- Shebang语法错误,正确写法是
#!/bin/bash(感叹号在前) - 单独启动的
sleep+exec子shell只会修改自身的输出方向,和process.sh的输出完全无关,无法实现你要的延迟重定向效果
下面提供两种可靠的实现方式:
方法一:纯Bash管道控制输出(推荐,无需额外工具)
这个方法通过管道捕获process.sh的所有输出,前5秒将内容打印到终端,之后自动写入cache_file:
#!/bin/bash # 定义输出控制函数 manage_output() { local start_timestamp=$(date +%s) # 逐行读取输入内容 while IFS= read -r line; do local current_timestamp=$(date +%s) # 判断是否超过5秒阈值 if (( current_timestamp - start_timestamp < 5 )); then echo "$line" # 前5秒输出到终端 else echo "$line" >> cache_file # 5秒后写入文件 fi done } # 启动process.sh,将其标准输出和错误输出都传入控制函数,后台运行 process.sh 2>&1 | manage_output &
方法二:使用GDB修改运行中进程的文件描述符(需要GDB依赖)
如果需要直接修改已运行进程的输出方向,可以用GDB来重定向它的标准输出,适合更复杂的场景:
#!/bin/bash # 启动process.sh并记录进程ID process.sh & PROC_PID=$! # 等待5秒后,用GDB修改该进程的标准输出到cache_file sleep 5 gdb -p "$PROC_PID" -batch \ -ex 'call close(1)' \ -ex 'call open("cache_file", 65, 384)' > /dev/null 2>&1
注:65对应
O_WRONLY | O_CREAT,384对应权限0600;该方法需要当前用户对process.sh进程有调试权限,且系统已安装GDB。
内容的提问来源于stack exchange,提问作者kailas.sheregar
相关产品推荐
相关产品推荐

