Jak uruchomić skrypt, gdy zasilacz jest podłączony lub wyłączony?

8

Z jakiegoś powodu jasność ekranu mojego laptopa nie aktualizuje się po podłączeniu lub odłączeniu zasilania. Spojrzałem na kilka rozwiązań tego problemu, ale żadne z nich nie działało dobrze. Zamiast więc rozpaczać i poddawać się, postanowiłem spróbować przekształcić to w naukę i sprawdzić, czy nie mogę napisać skryptu, który zrobi to za mnie.

Próbowałem to rozgryźć sam, oczywiście z pomocą Internetu, ale jestem całkiem nowy w bash skryptach i ogólnie Ubuntu, więc nie zaszedłem daleko.

Co udało mi się dowiedzieć, że mogę znaleźć stanu baterii z

$ upower -i /org/freedesktop/UPower/devices/battery_BAT1 | grep -E "state"
state:     charging/discharging

w zależności od tego, czy zasilacz jest podłączony. Nie wiem, czy to w ogóle jest przydatne, ale jest trochę fajne i wcześniej nie wiedziałem, jak go używać grep, więc do diabła, nauka jest fajna.

W każdym razie, czy jest na to jakiś czysty sposób? Przez „czysty sposób” rozumiem tylko sposób, który może zrozumieć osoba z ograniczonym doświadczeniem w skryptach bash.

Jeden podobne pytanie Okazało się, że miał dobrą odpowiedź jest ta , która mówi, co następuje:

Kiedy podłączasz / odłączasz zasilacz, skrypty /etc/pm/power.dsą wywoływane z> argumentem: „prawda” (jeśli korzystasz z baterii) lub „fałsz” (jeśli korzystasz z zasilania> zasilacza).

Problem polega na tym, że nie wiem, jak uzyskać dostęp do tego argumentu ze skryptu. Myślę, że wszystko sprowadza się do dość prostego problemu, ale pomyślałem, że i tak opublikuję pytanie, na wypadek gdyby ludzie mieli lepsze rozwiązania.

Jaspis
źródło

Odpowiedzi:

5

Możesz użyć on_ac_powerdo uruchomienia skryptu, gdy zasilacz jest włączony lub wyłączony.

Wypróbuj poniższe w terminalu.

$ on_ac_power
$ echo $?
0              ## Laptop on ac power

$ on_ac_power
$ echo $?
1              ## Laptop on battery (not on ac power)

Na tej podstawie możesz wykonać skrypt jako,

#!/bin/bash
while true
do
    if on_ac_power; then 
        do_something               ## Laptop on power
    else
        do_something_else          ## Laptop on battery
    fi
    sleep 10                       ## wait 10 sec before repeating
done

EDYCJA: [sugerowane przez KasiyA ]

cron job byłoby lepszym pomysłem na uruchamianie skryptu w regularnych odstępach czasu zamiast korzystania z nieskończonej pętli.

Zapisz skrypt jako myscript.shi umieść w nim następującą treść,

#!/bin/bash
if on_ac_power; then 
    do_something
else
    do_something_else
fi

Uczyń skrypt z terminalu chmod +x /path/to/myscript.sh. Otwórz swój osobisty crontabjako EDITOR=gedit crontab -ei dodaj w nim następujący wiersz, aby uruchomić skrypt co minutę.

* * * * * /path/to/myscript.sh 
souravc
źródło
Czy to zła praktyka, aby skrypty działały nieskończenie, czy jest to coś, co dzieje się regularnie i jest wbudowane w system? Chyba szukałem jakiegoś wyzwalacza, ale jeśli to zadziała, to jest o wiele mniej skomplikowane, niż się spodziewałem.
Jasper
@TheQZ: Myślę, że „souravc” dał podstawową ideę… na tej podstawie możesz pisać własne :)
heemayl
@TheQZ Chociaż działa wiecznie, ale staje się aktywny tylko raz na 10 sekund (możesz wydłużyć czas sprawdzania). Spójrz na pytanie, jak powtarzać polecenia-co-x-interwał czasu . W przeciwnym razie musisz napisać własny program demona, który jest bardzo skomplikowany dla początkujących.
souravc
@TheQZ Możesz użyć odpowiedzi souravc jako zadania crona . patrz druga część mojej odpowiedzi
αғsнιη
2
Lepszym sposobem jest użycie reguły udev jak w askubuntu.com/questions/613741/… .
Anthony Wong,