You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该Bash脚本内存占用持续增长?附报错与脚本代码

解决Bash脚本内存持续增长与pidof报错问题

问题原因分析

  • 内存持续增长:外层无限while true循环每2秒就启动3个后台进程,若对应应用未运行,这些进程会进入until循环无限等待进程启动,导致后台积累大量等待进程,持续占用内存。
  • pidof报错:pidof检查进程状态时,目标进程可能刚好退出,导致读取/proc/[pid]/stat失败,属于竞态条件,不影响功能但会输出错误信息。

解决方案

  1. 重构监控逻辑:每个应用仅保留一个长期运行的监控进程,实现「等待应用启动→调整窗口→等待应用退出→再次等待启动」的循环,避免重复创建等待进程。
  2. 消除报错输出:将pidof的错误输出重定向到/dev/null,屏蔽不必要的报错信息。
  3. 可选优化:动态获取屏幕分辨率,替换固定数值,适配不同尺寸的屏幕。

修改后的脚本

#!/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 03:40:21