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" <