Page 1 sur 1

[systemd] Timing des lancements

Publié : sam. 19 sept. 2015, 10:36
par cycyx
Bonjour,

Je vous expose mon soucis, merci de me dire/déplacer si je ne suis pas dans la bonne section.

J'ai créé un script qui fait 2-3 choses concernant la gestion d'énergie sur mon portable (car systemd ne gère pas encore tout).

Le voici :

Code : Tout sélectionner

#!/bin/bash
#
# powersave
#
# Power saving script, simple and short.
# Can be customised by adding commands.
#

# Variables to edit to reflect your configuration

# Path to backlight file
declare -r backlight="/sys/class/backlight/acpi_video0/brightness"
# Brightness value for unplugged state
declare -r min_light=1
# Brightness value for plugged state (check for *your* hardware max value in /path/to/backlight/function/max_brightness)
declare -r max_light=5
# Modules to load/unload depending on AC state
#declare -r modules="bluetooth btusb uvcvideo"

# Path to battery state file
declare -r battery_state="/sys/bus/acpi/drivers/ac/ACPI0003:00/power_supply/AC/online"

function usage () {
  echo "Usage: $0 [true|false]"
  exit 1
}

if [ $# -lt 1 ]; then
  usage
fi

# Function run when the AC battery is unplugged
function unplugged () {
  # Log state
  logger "Powersave state: Unplugged"

  # Change screen brightness
  echo $min_light > $backlight

  # Unload power hungry modules
  #modprobe -rs $modules

  # Change CPU scaling governor
  for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo powersave > $i
  done 

  # Enter power save state for sound device
  echo 1 > /sys/module/snd_hda_intel/parameters/power_save
}

# Function run when the AC battery is plugged
function plugged () {
  # Log state
  logger "Powersave state: Plugged"

  # Change screen brightness
  echo $max_light > $backlight

  # Load power hungry modules
  #for m in $modules; do
  #  modprobe -s $m
  #done

  # Change CPU scaling governor
  for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo performance > $i
  done 

  # Quit power save state for sound device
  echo 0 > /sys/module/snd_hda_intel/parameters/power_save
}

function guess_and_act () {
  # Get online status and call appropriate function
  [[ `cat $battery_state` -eq 1 ]] && plugged || unplugged
}

case "$1" in
  true)
    unplugged
    ;;
  false)
    plugged
    ;;
  guess)
    guess_and_act
    ;;
  *)
    usage
    ;;
esac

exit 0

# EoF
Je lui ai associé un "unit file" :

Code : Tout sélectionner

[Unit]
Description=Launch powersaving script
Wants=lxdm.service
After=multi-user.target lxdm.service

[Service]
User=root
Type=simple
ExecStart=/usr/local/bin/powersave guess

[Install]
WantedBy=graphical.target

Et j'ai joué avec à peu près toutes les possibilités pour "After" : graphical.target, etc

Le problème est le suivant. Au boot, dans les log j'ai :

Code : Tout sélectionner

powersave[426]: /usr/local/bin/powersave: ligne 58 : echo: erreur d'écriture : Aucun périphérique ou adresse
C'est au moment d'écrire dans "/sys/class/backlight/acpi_video0/brightness".

En revanche, dès que je suis loggué, si je lance le script, cela fonctionne.

La question est donc, quel est le timing des "units", et pourquoi le script ne fonctionne pas en étant lancé après lxdm, alors qu'il fonctionne lorsque je suis loggué sous X ?

Merci à vous...

Re: [systemd] Timing des lancements

Publié : sam. 19 sept. 2015, 11:00
par benjarobin
Comme ton service est "étrange", peux tu tester ceci : désactive le lancement du service au démarrage. Puis redémarre, connecte toi sous X et depuis ton interface graphique donne la sortie de :

Code : Tout sélectionner

systemctl status -l nom-de-ton.service
systemctl start nom-de-ton.service
systemctl status -l nom-de-ton.service
Sinon tu as un gestionnaire d’énergie très bien fait : Laptop Mode Tools, je n'aime juste pas sa configuration par défaut.

Re: [systemd] Timing des lancements

Publié : sam. 19 sept. 2015, 12:09
par cycyx
Voici :

Code : Tout sélectionner

$ systemctl status -l powersave
● powersave.service - Launch powersaving script
   Loaded: loaded (/etc/systemd/system/powersave.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

Code : Tout sélectionner

$ systemctl start powersave

Code : Tout sélectionner

$ systemctl status -l powersave
● powersave.service - Launch powersaving script
   Loaded: loaded (/etc/systemd/system/powersave.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

sept. 19 12:07:21 clevo systemd[1]: Started Launch powersaving script.
Et moi non plus je n'aime pas trop Laptop Mode Tools, ni aucun des autres gestionnaires tout faits (pis là n'est pas le but de ma question)...

Re: [systemd] Timing des lancements

Publié : sam. 19 sept. 2015, 19:13
par avi3000
/sys/class/backlight/acpi_video0/brightness étant un lien symbolique, il n'existe probablement pas au moment où ton script s'exécute.

Re: [systemd] Timing des lancements

Publié : sam. 19 sept. 2015, 20:07
par cycyx
Certes, mais je ne vois pas quel processus le crée. J'étais persuadé qu'il suffisait que X soit lancé pour que ce lien existe, ce qui serait logique.

Or, même en attendant que mon "dm" soit lancé, cela ne fonctionne pas.

Du coup je suis perplexe...

Re: [systemd] Timing des lancements

Publié : dim. 20 sept. 2015, 13:34
par avi3000
sur mon portable ce lien existe avant le lancement de la session utilisateur.

On gère plutôt ce paramètre coté utilisateur.

sinon https://wiki.archlinux.org/index.php/Backlight

Re: [systemd] Timing des lancements

Publié : dim. 20 sept. 2015, 14:35
par cycyx
J'ai déjà lu cette page et mon script fonctionne : quand je débranche l'alim, l'écran s'assombrit, et quand je la rebranche, il s'éclaire. Il est appelé par udev.

Et systemd enregistre bien la valeur du "backlight" : à chaque démarrage, la luminosité est restaurée à sa valeur.

Le problème est présent lorsque le changement d'état (branché ou non) survient quand le laptop est étaint.

Si j'éteins le portable branché et que je l'allume débranché, l'écran est trop lumineux (et inversement : il est trop sombre si je l'éteins sur batterie et le rallume sur alimentation).
Je voudrais donc lancer automatiquement ce script au démarrage du portable, en "oneshot", en root et pensais me servir de systemd pour ça.

Mais je n'arrive pas à voir à quel moment (ou par quel service ce foutu lien est créé...

Re: [systemd] Timing des lancements

Publié : dim. 20 sept. 2015, 17:57
par avi3000
@Mais je n'arrive pas à voir à quel moment (ou par quel service ce foutu lien est créé...
je pencherais pour udev.

Je ne pense pas que restaurer la luminosité de l'écran au boot ou en sortie de veille soit une bonne idée, surtout sur un portable.
Sauf à travailler dans une cave ou un bureau sans fenêtre, l'environnement lumineux sera souvent différent entre l'arrêt et le démarrage de l'ordi.

sur mes ordis

Code : Tout sélectionner

readlink /etc/systemd/system/systemd-backlight@acpi_video0.service
/dev/null