Подолання втрат пам’яті у gnome-shell
У оболонці GNOME тече пам’ять, псуючи враження від користування. Наприклад, може заморозити ноутбук постійним підкачуванням. Щоб протистояти, нам доводилося виявляти цю ситуацію, перемикатися до віртуального терміналу, заходити в систему і убивати схиблений процес. На щастя, перезапускання gnome-shell майже непомітне і безпечне. Щойно я збагнув, що нагляд над оболонкою можна легко автоматизувати.
Спочатку ми створюємо дію ~/bin/check-gnome-shell.sh
:
#!/bin/bash
# Убити будь-який процес gnome-shell, який займає більше, ніж 300 Mb пам’яті
ps -A --sort -rss -o comm,pid,rss | grep '^gnome-shell\s' | awk '{print $2, $3}' | \
while read -r pid rss; do
[[ "$rss" -gt 300000 ]] && kill -KILL $pid || true
done
Потім ми створюємо однозарядну користувацьку службу
~/.config/systemd/user/check-gnome-shell.service
:
[Unit]
Description=Check whether gnome-shell doesn't leak memory
[Service]
Type=oneshot
ExecStart=/bin/bash /home/sakhnik/bin/check-gnome-shell.sh
Потім таймер ~/.config/systemd/user/check-gnome-shell.timer
:
[Unit]
Description=Check whether gnome-shell is leaking memory
[Timer]
OnCalendar=*:0/5
[Install]
WantedBy=timers.target
І нарешті ми активуємо і запускаємо таймер:
systemctl --user enable check-gnome-shell.timer
systemctl --user start check-gnome-shell.timer
Це все. Щоп’ять хвилин виконується дія. Вона перевіряє зайняту пам’ять процесів gnome-shell і вбиває тих, що перебирають 300M.