Comment puis-je exécuter un script lorsque l'alimentation est branchée ou coupée?

8

Pour une raison quelconque, la luminosité de l'écran de mon ordinateur portable ne se met pas à jour lorsque je branche ou débranche l'alimentation. J'ai examiné pas mal de solutions à ce problème, mais aucune ne semblait bien fonctionner. Donc, au lieu de désespérer et d'abandonner, j'ai décidé d'essayer de transformer cela en une expérience d'apprentissage et de voir si je ne peux pas écrire un script qui le fasse pour moi.

J'ai essayé de le comprendre par moi-même, avec de l'aide d'Internet, bien sûr, mais je suis assez nouveau dans les scripts bash et Ubuntu en général, donc je ne suis pas allé loin.

Ce que j'ai pu comprendre, c'est que je peux trouver l'état de la batterie avec

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

selon que l'adaptateur secteur est branché ou non. Je ne sais pas si c'est même utile, mais c'est plutôt cool, et je ne savais pas comment l'utiliser grepavant, alors bon sang , apprendre est amusant.

Quoi qu'il en soit, existe-t-il une façon quelque peu propre de procéder? Par «voie propre», je veux juste dire une façon dont une personne ayant une expérience limitée en script bash pourrait comprendre.

Une question similaire que j'ai trouvée qui avait une bonne réponse est celle-ci , qui dit ce qui suit:

Lorsque vous branchez / débranchez l'adaptateur secteur, les scripts /etc/pm/power.dsont appelés avec> un argument: "vrai" (si vous utilisez la batterie) ou "faux" (si vous exécutez avec l'adaptateur> d'alimentation).

Le problème est que je ne sais pas comment accéder à cet argument depuis un script. Donc, je suppose que tout se résume à un problème assez simple, mais je pensais que je publierais la question de toute façon, au cas où les gens auraient de meilleures solutions.

Jaspe
la source

Réponses:

5

Vous pouvez utiliser on_ac_powerpour exécuter un script lorsque l'alimentation est activée ou désactivée.

Essayez ce qui suit dans un terminal.

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

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

Sur cette base, vous pouvez créer votre script comme,

#!/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

EDIT: [suggéré par KasiyA ]

cron job serait une meilleure idée pour exécuter le script à un intervalle régulier au lieu d'utiliser une boucle infinie.

Enregistrez votre script sous myscript.shet mettez-y le contenu suivant,

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

Faire le script exécutable à partir d' un terminal, chmod +x /path/to/myscript.sh. Ouvrez votre personnel crontabcomme EDITOR=gedit crontab -eet ajoutez la ligne suivante pour exécuter le script chaque minute.

* * * * * /path/to/myscript.sh 
souravc
la source
Est-ce une mauvaise pratique d'avoir des scripts qui s'exécutent à l'infini, ou est-ce quelque chose qui se produit régulièrement et qui est intégré au système? Je suppose que je cherchais une sorte de déclencheur, mais si cela fonctionne, alors c'est beaucoup moins compliqué que je ne l'avais supposé.
Jasper
@TheQZ: Je pense que 'souravc' a donné l'idée de base .. vous pouvez écrire le vôtre sur la base de cela :)
heemayl
@TheQZ Bien qu'il s'exécute indéfiniment mais ne devienne actif qu'une fois toutes les 10 s (vous pouvez augmenter le temps de vérification). Regardez la question de savoir comment répéter une commande tous les x intervalles de temps . Sinon, vous devez écrire votre propre programme démon, ce qui est très compliqué pour les débutants.
souravc
@TheQZ Vous pouvez utiliser la réponse de souravc comme tâche cron . voir la deuxième partie de ma réponse
αғsнιη
2
Une meilleure façon est d'utiliser la règle udev comme dans askubuntu.com/questions/613741/… .
Anthony Wong