电脑指南
第二套高阶模板 · 更大气的阅读体验

脚本执行输出重定向在路由调优中的实用技巧

发布时间:2026-03-22 12:31:16 阅读:2 次

在路由器刷了 OpenWrt 或其他 Linux 类固件后,很多老手会写 shell 脚本来自动完成端口转发、DNS 优化、流量限速等任务。但跑着跑着发现:脚本明明执行了,日志却没留下痕迹;或者错误信息直接刷屏,根本没法排查问题——这时候,输出重定向就不是可选项,而是刚需。

为什么路由脚本特别需要重定向?

家用路由器资源有限,没有图形界面,也没有 syslog 实时查看工具。比如你写了个定时检测 DNS 延迟的脚本,想每天早上 6 点跑一次,把结果存下来对比:
如果不重定向,stdout 和 stderr 全丢进 /dev/console,一重启就没了;如果直接 echo 到 /tmp/dns.log,又可能因 /tmp 是内存分区,断电即清空。

常用重定向写法,直接抄就能用

假设你的脚本叫 /root/check_route.sh,内容是测试网关连通性并记录时间:

#!/bin/sh
DATE=$(date +"%Y-%m-%d %H:%M:%S")
PING_RESULT=$(ping -c 1 192.168.1.1 | grep "time=" | awk '{print $7}')
echo "[$DATE] Gateway: ${PING_RESULT:-timeout}"

运行它时,加上这行重定向,就能稳稳落地:

/root/check_route.sh >> /mnt/sda1/logs/route.log 2>&1

解释一下:
>> 是追加写入(避免覆盖旧日志);
/mnt/sda1/logs/ 是挂载在 U 盘或 SSD 上的持久化路径,比 /tmp 更靠谱;
2>&1 表示把错误输出也合并进标准输出,一起记到 log 里。

更省心的写法:脚本内部自带重定向

直接在脚本开头加一句,后面所有 echo、ping、curl 都自动进日志:

#!/bin/sh
exec >> /mnt/sda1/logs/route.log 2>&1
date
ping -c 1 192.168.1.1 | grep time=

这样不用每次调用都写一堆重定向符号,适合长期驻留的监控脚本。

别踩坑:几个真实翻车现场

有人把日志写到 /var/log/ 下,结果发现每次重启就消失——因为 OpenWrt 的 /var 是 tmpfs 内存文件系统;
还有人用 >(单个大于号)覆盖写,结果某天磁盘满了,日志被清空,关键故障点就断档了;
最典型的是忘了加 2>&1,脚本看着“跑成功”了,其实报了一堆 permission denied,全被吞掉没看见。

实战小技巧:按天分文件,不撑爆存储

如果天天往一个文件里狂写,U 盘寿命和排查效率都吃紧。试试这个动态文件名:

LOGFILE="/mnt/sda1/logs/route_$(date +\"%Y%m%d\").log"
/root/check_route.sh >> "$LOGFILE" 2>&1

配合 crontab 每天 00:01 执行一次,自然按日期切片,查上周三的问题?直接打开 route_20240515.log 就行。