正确做法是用 find -print0 与 xargs -0 配合处理空格路径,加 -f 避免确认,并先用 echo 做 dry-run;Nginx 日志需用 -F'"' 和 match() 提取 URL;source 不导出变量,须显式 export;systemctl Restart 失效常因进程未真正启动或退出码未被识别。

如何用 find + xargs 安全批量删除带空格的旧日志文件
直接用 rm $(find ...) 会因路径含空格或换行而误删——这是线上事故高发点。
正确做法是让 find 输出 null 分隔,xargs 用 -0 消费:
find /var/log/app -name "*.log" -mtime +30 -print0 | xargs -0 rm -f
-
-print0和-0必须配对,否则空格路径仍会断裂 - 加
-f避免交互确认,但上线前先用echo替代rm做 dry-run - 若需按大小过滤(比如只删 >100MB 的),加
-size +100M,注意单位大小写敏感
用 awk 提取 Nginx 访问日志中耗时 Top 10 的 URL(含中文路径)
默认 awk 按空白分隔,但 Nginx 日志里 $request 字段含空格,且可能有 UTF-8 中文,直接 $7 取不到完整 URL。
可靠方式是用双引号为边界,配合 match() 提取:
awk -F'"' '{if (NF >= 3) {match($3, / ([^ ]+) ([^ ]+) /); print substr($3, RSTART+1, RLENGTH-2)}}' /var/log/nginx/access.log | awk '{print $2, $1}' | sort -k1,1nr | head -10
- 第一段
-F'"'把双引号当字段分隔符,$3 就是整个 request 字符串 - 第二段
match()匹配出 “方法 URL 协议” 中的 URL 部分(跳过开头空格和后续空格) - 中文路径无需额外转义,只要终端 locale 是
en_US.UTF-8或类似即可正常输出
为什么 source ~/.bashrc 在脚本里不生效?export 和 env 的作用域差异
在 shell 脚本里写 source ~/.bashrc,变量看似加载了,但后续 ssh user@host cmd 或子进程仍看不到——因为 source 只影响当前 shell 进程,不自动导出到环境。
- 必须显式
export VAR=value,或在~/.bashrc里对变量加export -
env | grep VAR能验证是否真正进入环境;printenv VAR更可靠(绕过别名干扰) - 非交互式 shell(如 cron、
ssh host cmd)默认不读~/.bashrc,得用bash -i -c 'cmd'或改用~/.profile
用 systemctl 管理自定义服务时,Restart=on-failure 为何没触发重试
常见错因:服务进程退出码不是非零,或被 ExecStartPre 拦截后未真正启动主进程。
- 检查
systemctl status your-service的Active:行——若显示inactive (dead),说明根本没跑起来,Restart不生效 - 加
RestartSec=5避免高频重启;设StartLimitIntervalSec=60和StartLimitBurst=3防止崩溃循环 - 用
journalctl -u your-service -n 50 -f看真实 exit code;若程序本身静默退出(如 Python 未捕获异常),需加StandardExitStatus=1,2,143显式声明哪些码算失败
find | xargs 管道中断时不会报错,systemctl restart 成功但服务立刻退出却没看 journal。动手前先确认「谁在哪个环境里执行、输出去哪了、失败时有没有留痕」。










