为何该Bash脚本内存占用持续增长?附报错与脚本代码
解决Bash脚本内存持续增长与pidof报错问题
问题原因分析
- 内存持续增长:外层无限
while true循环每2秒就启动3个后台进程,若对应应用未运行,这些进程会进入until循环无限等待进程启动,导致后台积累大量等待进程,持续占用内存。 - pidof报错:
pidof检查进程状态时,目标进程可能刚好退出,导致读取/proc/[pid]/stat失败,属于竞态条件,不影响功能但会输出错误信息。
解决方案
- 重构监控逻辑:每个应用仅保留一个长期运行的监控进程,实现「等待应用启动→调整窗口→等待应用退出→再次等待启动」的循环,避免重复创建等待进程。
- 消除报错输出:将
pidof的错误输出重定向到/dev/null,屏蔽不必要的报错信息。 - 可选优化:动态获取屏幕分辨率,替换固定数值,适配不同尺寸的屏幕。
修改后的脚本
#!/bin/bash # 动态获取屏幕分辨率(适配不同屏幕,可注释改用固定数值) get_screen_resolution() { local res=$(xrandr | grep '*' | awk '{print $1}') SCREEN_WIDTH=$(echo "$res" | cut -d'x' -f1) SCREEN_HEIGHT=$(echo "$res" | cut -d'x' -f2) HALF_WIDTH=$((SCREEN_WIDTH / 2)) HALF_HEIGHT=$((SCREEN_HEIGHT / 2)) } get_screen_resolution # 监控并调整Notepadqq窗口 resizeNotepadqq() { while true; do # 等待进程启动,重定向错误输出消除报错 until pidof notepadqq-bin &>/dev/null; do sleep 1 done sleep 0.1 # 左侧半屏宽度,全屏高度 wmctrl -xr "notepadqq-bin.Notepadqq" -e 0,0,0,$HALF_WIDTH,-1 # 等待进程退出后,再循环监控下一次启动 while pidof notepadqq-bin &>/dev/null; do sleep 1 done done } # 监控并调整终端窗口 resizeTerminal() { while true; do until pidof gnome-terminal-server &>/dev/null; do sleep 1 done sleep 0.1 # 右上角半屏区域 wmctrl -xr "gnome-terminal-server" -e 0,$HALF_WIDTH,0,$HALF_WIDTH,$HALF_HEIGHT while pidof gnome-terminal-server &>/dev/null; do sleep 1 done done } # 监控并调整Celluloid窗口 resizeCelluloid() { while true; do until pidof celluloid &>/dev/null; do sleep 1 done sleep 0.1 # 右下角半屏区域 wmctrl -xr "celluloid_player" -e 0,$HALF_WIDTH,$HALF_HEIGHT,$HALF_WIDTH,$HALF_HEIGHT while pidof celluloid &>/dev/null; do sleep 1 done done } # 启动三个监控进程并后台运行 resizeNotepadqq & resizeTerminal & resizeCelluloid & wait
额外说明
- 若
wmctrl无法匹配窗口,可运行wmctrl -lx查看窗口的类名(第三列),替换脚本中对应的参数(如notepadqq-bin.Notepadqq)。 - 若无需适配不同屏幕,可注释掉
get_screen_resolution函数,换回原脚本中的固定坐标数值。
内容的提问来源于stack exchange,提问作者Gary
相关产品推荐
相关产品推荐

