Wyłączanie Linuxa (Mint u mnie) po określonym czasie.

Ograniczanie zużycia energii staje się mim kolejnym hobby (XD).
Początkowo planowałem użyć wbudowanych mechanizmów usypiania ale one źle działają z moim Latitude5490 od Flexee. Laptop usypia się z włączonym podświetlaniem klawiatury i nie chce wstać. Dlatego przy użyciu AI stworzyłem rozwiązanie bezkompromisowe: użytkownik ustala czas po którym wyświetli się komunikat o zamknięciu, program domyślnie poczeka 10 minut. Jeśli użytkownik śpi, system zostanie zamknięty. Czasy można ustawiać z pozycji traya. Swoją drogą, przywróciłem temu komputerowi stan idealny, wydając zaledwie 60PLN na obudowę, matrycę 1080p, sprawną klawiaturę i touchpad. Grat posłuży jeszcze długo, dzięki Flexee :)

Zapisz poniższy skrypt jako skrypt.sh
Uruchom poleceniem bash ./skrypt.sh

#!/bin/bash

# usuń stare wystąpienia
echo "Usuwanie poprzednich ustawień"
pkill -f "run_timer_shutdown.sh" 2>/dev/null
pkill -f "yad" 2>/dev/null
sleep 1

UNINSTALL=false
if [ "$1" == "--uninstall" ]; then
    UNINSTALL=true
fi
if $UNINSTALL; then
    echo "=== Odinstalowywanie ==="
    rm -rf "$HOME/.config/timer-shutdown"
    rm -f "$HOME/.config/autostart/timer-shutdown.desktop"
    find "$HOME" -name "*timer*shutdown*" -o -name "*timer_shutdown*" 2>/dev/null | xargs rm -f 2>/dev/null
    echo "✔ Odinstalowano."
    exit 0
fi
echo "=== Automatyczne wyłączenie po czasie ==="
while true; do
    read -p "Podaj czas w minutach po którym komputer ma się wyłączyć: " TIMER_MIN
    if ! [[ "$TIMER_MIN" =~ ^[0-9]+$ ]] || [ "$TIMER_MIN" -le 0 ]; then
        echo "Błąd: podaj liczbę minut większą od 0."
        continue
    fi
    break
done
CONFIG_DIR="$HOME/.config/timer-shutdown"
mkdir -p "$CONFIG_DIR"
SCRIPT="$CONFIG_DIR/run_timer_shutdown.sh"
cat > "$SCRIPT" <<'ENDOFSCRIPT'
#!/bin/bash
CONFIG_DIR="$HOME/.config/timer-shutdown"

# Inicjalizacja plików przy pierwszym uruchomieniu
if [ ! -f "$CONFIG_DIR/limit_min" ]; then
    echo "PLACEHOLDER_MIN" > "$CONFIG_DIR/limit_min"
fi
if [ ! -f "$CONFIG_DIR/timeout_sec" ]; then
    echo "600" > "$CONFIG_DIR/timeout_sec"
fi

# Jeśli przekazano parametry, zapisz je do plików konfiguracyjnych
if [ -n "$1" ]; then
    echo "$1" > "$CONFIG_DIR/limit_min"
fi
if [ -n "$2" ]; then
    echo "$2" > "$CONFIG_DIR/timeout_sec"
fi

# Odczyt aktualnych wartości z plików
LIMIT_MIN=$(cat "$CONFIG_DIR/limit_min")
TIMEOUT_SEC=$(cat "$CONFIG_DIR/timeout_sec")

start_tray() {
    PIPE=$(mktemp -u /tmp/yad-tray-XXXXXX)
    mkfifo "$PIPE"
    
    yad --notification \
        --image="appointment-soon" \
        --text="Timer: $LIMIT_MIN min" \
        --command="echo" \
        --menu="Zmień czas timera!sh -c 'NEW=\$(yad --entry --title=\"Czas\" --text=\"Podaj czas timera (min):\" --entry-text=\"$LIMIT_MIN\" --center); [ -n \"\$NEW\" ] && \"$0\" \"\$NEW\" \"$TIMEOUT_SEC\"'|Zmień czas reakcji!sh -c 'NEW_REAKCJA=\$(yad --entry --title=\"Reakcja\" --text=\"Podaj czas reakcji (min):\" --entry-text=\"\$(($TIMEOUT_SEC / 60))\" --center); [ -n \"\$NEW_REAKCJA\" ] && \"$0\" \"$LIMIT_MIN\" \"\$((\$NEW_REAKCJA * 60))\"'|Zakończ!sh -c 'pkill -f run_timer_shutdown.sh; pkill -f yad'" \
        --listen < "$PIPE" &
    TRAY_PID=$!
    exec 3>"$PIPE"
}

# Jeśli skrypt został wywołany ponownie (z menu zmiany czasu), zabij poprzednie okno
pkill -f "yad --notification" 2>/dev/null

start_tray

while true; do
    sleep $((LIMIT_MIN * 60)) &
    SLEEP_PID=$!

    for (( i=LIMIT_MIN; i>0; i-- )); do
        echo "tooltip:Wyłączenie za: $i min\n(Czas reakcji: $(($TIMEOUT_SEC / 60)) min)" >&3
        sleep 60
    done
    wait $SLEEP_PID

    echo "quit" >&3
    wait $TRAY_PID

    yad --title="Wyłączenie komputera" \
        --text="Minęło $LIMIT_MIN minut.\nKomputer wyłączy się za $(($TIMEOUT_SEC / 60)) minut." \
        --button="Przedłuż:0" \
        --timeout=$TIMEOUT_SEC \
        --timeout-indicator=bottom \
        --center \
        --no-escape
    EXIT_CODE=$?

    if [ "$EXIT_CODE" -eq 0 ]; then
        start_tray
        continue
    else
        systemctl poweroff
        exit
    fi
done
ENDOFSCRIPT
sed -i "s/PLACEHOLDER_MIN/$TIMER_MIN/" "$SCRIPT"
chmod +x "$SCRIPT"
if ! command -v yad &>/dev/null; then
    echo "Instalowanie yad..."
    sudo apt-get install -y yad
fi
AUTOSTART_DIR="$HOME/.config/autostart"
mkdir -p "$AUTOSTART_DIR"
cat > "$AUTOSTART_DIR/timer-shutdown.desktop" <