Working script that suspends heavy processes when screen off but looking for event to suspend processes when locked or call in progress

Here is a script I wrote to suspend some heavy processes like firefox-esr when screen is off to reduce power usage and excess heat. Doing a good job at keeping phone cool in pocket (along with 2min30sec suspend timeout) but would be a lot better if I could have it react to the screen being locked and a call in progress. Any ideas on how to monitor for these events?

#!/bin/bash

# Variable to store the previous screen status
prev_status=""

# Function to check screen status
check_screen_status() {
    # Retrieve current screen status
    screen_status=$(wlr-randr | grep -o "Enabled: yes")
    
    # Compare current status with previous status
    if [ "$screen_status" != "$prev_status" ]; then
        if [ -n "$screen_status" ]; then
            echo "Screen is ON"
            #kill -CONT `pgrep -o Nheko` &
            kill -CONT `pgrep -o firefox-esr` &
            kill -CONT `pgrep -o armcord` &
            #kill -CONT `pgrep -o gnome-software` &
            kill -CONT `pgrep -o telegram` &
            kill -CONT `pgrep -o moonlight ` &
        else
            echo "Screen is OFF"
            #kill -STOP `pgrep -o Nheko`
            kill -STOP `pgrep -o firefox-esr`
            #kill -STOP `pgrep -o armcord`
            #kill -STOP `pgrep -o telegram`
            kill -STOP `pgrep -o gnome-software`
            kill -STOP `pgrep -o moonlight`
            # Run your command here when the screen turns off
            # Example: notify-send "Screen turned off"
        fi
        # Update previous status
        prev_status="$screen_status"
    fi
}

# Main loop to continuously check screen status
while true; do
    check_screen_status
    sleep 1  # Adjust sleep interval as needed
done

5 Likes

Mind if I mod this script for my current setup?

1 Like

Go for it! Posted it to share and maybe work together to improve it.

3 Likes

Thought of suspending Geary and some other programs so that they open in background when the screen becomes active.

1 Like

You could use journalctl -u ModemManager -n 1 | grep -c 'accepted\|ringing-out') if I’m not mistaken.

1 Like

I thought I’d share what this script has evolved into. I haven’t added the check for an active call but so far it doesn’t seem to need it.
I’ve added cgroups to to prevent swapping of important processes and to prevent swapping + restrict memory usage of firefox-esr which is a huge performance boost. It seems like as soon as firefox starts to swap it slows down a lot. It also seems like if any of the core/gnome/audio/ui processes have anything swapped things get a bit laggy. cgroups seem like the magic ticket to keep everything reliably smooth.
This script will require allowing some things in /etc/sudoers
I also created a shortcut to wake up firefox-esr on demand rather than every time the screen wakes to keep things cool and improves my standby time.

autosuspend.sh

#!/bin/bash
# Variable to store the previous screen status
prev_status=""
# Function to check screen status
check_screen_status() {
    # Retrieve current screen status
    screen_status=$(wlr-randr | grep -o "Enabled: yes")
    # Compare current status with previous status
    if [ "$screen_status" != "$prev_status" ]; then
        if [ -n "$screen_status" ]; then
            echo "Screen is ON"
echo "journalctl vacuum"
sudo journalctl --vacuum-size=100M
echo "Freeing RAM"
sudo sync
echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null && echo "Dropped caches"
#pgrep firefox-esr && echo firefox-esr CONT && kill -CONT `pgrep -o firefox-esr`
pgrep armcord && echo armcord CONT && kill -CONT `pgrep -o armcord`
pgrep telegram && echo telegram CONT && kill -CONT `pgrep -o telegram`
pgrep moonlight && echo moonlight CONT && kill -CONT `pgrep -o moonlight`
pgrep Nheko && echo Nheko CONT && kill -CONT `pgrep -o Nheko`

sudo cpufreq-set -c 0,1,2,3 --max 1500000 && cpufreq-info | grep -m 1 "current policy" | awk -F'[ -]+' '{print $8, $11}'
        else
            echo "Screen is OFF"
pgrep moonlight && echo moonlight STOP && kill -STOP `pgrep -o moonlight`
pgrep Nheko && echo Nheko STOP && kill -STOP `pgrep -o Nheko`

echo "cpu-freq"
sudo cpufreq-set -c 0,1,2,3 --max 1000000 && cpufreq-info | grep -m 1 "current policy" | awk -F'[ -]+' '{print $8, $11}'

echo "cgroup/firefox"
sudo mkdir /sys/fs/cgroup/firefox
echo "500M" | sudo tee /sys/fs/cgroup/firefox/memory.max
echo "0" | sudo tee /sys/fs/cgroup/firefox/memory.swap.max
echo `pgrep firefox-esr` | sudo tee /sys/fs/cgroup/firefox/cgroup.procs

echo "cgroup/core"
sudo mkdir /sys/fs/cgroup/core
echo "0" | sudo tee /sys/fs/cgroup/core/memory.swap.max
#echo "pipewire" && echo `pgrep pipewire` | sudo tee /sys/fs/cgroup/core/cgroup.procs
#echo "pipewire-media-session" && echo `pgrep pipewire-media-session` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep pulseaudio` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep rtkit-daemon` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep gnome-calls` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep callaudiod` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep NetworkManager` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep usbguard-dbus` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep phoc` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep squeekboard` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep ssh` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep sshd` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep ssh-agent` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep autossh` | sudo tee /sys/fs/cgroup/core/cgroup.procs
echo `pgrep chatty` | sudo tee /sys/fs/cgroup/core/cgroup.procs
sqlite3 /home/purism/purple/chatty/db/chatty-history.db "VACUUM;"
echo "swap off/on"
sudo swapoff -a
sudo swapon -a
pgrep firefox-esr && echo firefox-esr STOP && kill -STOP `pgrep -o firefox-esr`
        fi
        # Update previous status
        prev_status="$screen_status"
    fi
}
# Main loop to continuously check screen status
while true; do
    check_screen_status
    sleep 1  # Adjust sleep interval as needed
done

manualwake.sh

#kill -CONT `pgrep -o firefox-esr` &
for pid in $(pgrep -f firefox); do kill -CONT $pid; done

/etc/sudoers

...
purism ALL=(ALL) NOPASSWD: /usr/bin/sync
purism ALL=(ALL) NOPASSWD: /usr/bin/tee
purism ALL=(ALL) NOPASSWD: /usr/bin/journalctl --vacuum-size=100M
purism ALL=(ALL) NOPASSWD: /usr/bin/mkdir /sys/fs/cgroup/firefox
purism ALL=(ALL) NOPASSWD: /usr/bin/mkdir /sys/fs/cgroup/core
purism ALL=(ALL) NOPASSWD: /usr/sbin/swapon -a
purism ALL=(ALL) NOPASSWD: /usr/sbin/swapoff -a
purism ALL=(ALL) NOPASSWD: /usr/bin/tee
purism ALL=(ALL) NOPASSWD: /usr/bin/cpufreq-set
3 Likes