Escrevendo um serviço systemd para ser executado no resumo

15

meu laptop Dell está sujeito a esse erro no kernel 3.14. Como solução alternativa, escrevi um script simples

/ usr / bin / correção de brilho:

#!/bin/bash

echo 0 > /sys/class/backlight/intel_backlight/brightnes

(e fez executável: chmod +x /usr/bin/brightness-fix)

e um serviço systemd chamando-o que é executado na inicialização:

/etc/systemd/system/brightness-fix.service

[Unit]
Description=Fixes intel backlight control with Kernel 3.14

[Service]
Type=forking
ExecStart=/usr/bin/brightness-fix
TimeoutSec=0
StandardOutput=syslog
#RemainAfterExit=yes
#SysVStartPriority=99

[Install]
WantedBy=multi-user.target

e ativado: systemctl enable /etc/systemd/system/brightness-fix.service

Isso funciona como um encanto e eu posso controlar o brilho da tela conforme desejado. O problema surge quando o laptop é retomado após o modo de suspensão (por exemplo, ao fechar a borda do laptop): o controle de brilho não funciona mais, a menos que eu execute manualmente meu script fisrt acima:/usr/bin/brightness-fix

Como posso criar outro serviço systemd como o meu acima para ser executado no tempo de currículo?

EDIT: De acordo com os comentários abaixo eu modifiquei meu brightness-fix.serviceassim:

[Unit]
Description=Fixes intel backlight control with Kernel 3.14

[Service]
Type=oneshot
ExecStart=/usr/local/bin/brightness-fix
TimeoutSec=0
StandardOutput=syslog

[Install]
WantedBy=multi-user.target sleep.target

Também adicionei echo "$1 $2" > /home/luca/br.logao meu script para verificar se ele é realmente executado. O script é realmente executado também em resume ( post suspend), mas não tem efeito (a luz de fundo é 100% e não pode ser alterada). Eu também tentei fazer logon $DISPLAYe $USER, na hora de retomar, eles estão vazios. Então, meu palpite é que o script seja executado muito cedo ao acordar do sono. Alguma dica?

lviggiani
fonte
2
WantedBy=sleep.target...
jasonwryan
Realmente?! Isso é tão simples ?! :) Posso adicionar 'sleep.target' ao meu script acima ou devo criar um novo script de serviço systemd dedicado para ele?
Lviggiani 11/04
... de acordo com a documentação "Esta opção pode ser usada mais de uma vez ou pode ser fornecida uma lista separada por espaços de nomes de unidades". Eu vou tentar agora.
Lviggiani 11/04/2014
você deve adicioná-lo ao arquivo de serviço systemd existente (que, a propósito, não é um script; é um arquivo de configuração estático). e como uma observação lateral, o padrão de hierarquia do sistema de arquivos declara que o local apropriado para colocar scripts que você mesmo escreveu /usr/local/binnão é /usr/bin. esse diretório está reservado apenas para o gerenciador de pacotes.
strugee
2
Acredito que o uso do sleep.targetirá executar a unidade quando o computador dorme, e não quando ele é reiniciado. Veja minha resposta abaixo para um arquivo de unidade que funcionou para mim com um problema semelhante.
precisa saber é

Respostas:

18

Sei que essa é uma pergunta antiga, mas o seguinte arquivo de unidade funcionou para eu executar um script após retomar do modo de suspensão:

[Unit]
Description=<your description>
After=suspend.target

[Service]
User=root
Type=oneshot
ExecStart=<your script here>
TimeoutSec=0
StandardOutput=syslog

[Install]
WantedBy=suspend.target

Eu acredito que é o After=suspend.targetque faz com que seja executado no currículo, e não quando o computador entra no modo de suspensão.

jat255
fonte
4
Trabalha com After=suspend.target na unidade e WantedBy=multi-user.target sleep.targetna instalação .
Emmanuel
Estou usando as seguintes unidades com sucesso aqui no Ubuntu 16.04 (Loki elementar).
Naftuli Kay
7

Como uma alternativa para escrever e ativar um arquivo de unidade, você também pode colocar um script de shell (ou um link simbólico no seu script) /lib/systemd/system-sleep/.

Ele será chamado antes de suspensão / hibernação e no tempo de retomada.

De man systemd-suspend.service:

Imediatamente antes de entrar no sistema suspender e / ou hibernar, systemd-suspend.service (e as outras unidades mencionadas, respectivamente) executará todos os executáveis ​​em / usr / lib / systemd / system-sleep / e transmitirá dois argumentos a eles. O primeiro argumento será "pré", o segundo "suspensão", "hibernação" ou "suspensão híbrida", dependendo da ação escolhida. Imediatamente após deixar o sistema suspender e / ou hibernar, os mesmos executáveis ​​são executados, mas o primeiro argumento agora é "post". Todos os executáveis ​​neste diretório são executados em paralelo e a execução da ação não é continuada até que todos os executáveis ​​sejam concluídos.

Teste com isso:

#!/bin/sh
## This file (or a link to it) must be in /lib/systemd/system-sleep/

logger -t "test" "\$0=$0, \$1=$1, \$2=$2"
mivk
fonte
A página de manual que você vincula menciona um arquivo colocado, /usr/libmas todos os seus exemplos se referem a arquivos em/lib
qdii
@qdii: pode depender da distribuição e / ou versão. No Debian 8 Jessie e no Ubuntu 16.04, o system-sleepdiretório parece estar dentro /lib/systemd/e /usr/lib/systemdcontém outras coisas.
precisa saber é o seguinte
1

Seguimento da resposta do mivk, na qual evito mexer com um novo arquivo de unidade (veja minha pergunta aqui Como reagir a eventos de laptop ) ? ). Aqui está a minha solução; não é 100% direto ( suspiro ) porque o sistema não é estável quando sai do sono:

Na minha caixa do Fedora 26, coloquei um link simbólico aqui: /usr/lib/systemd/system-sleep/sleepyheadque aponta aqui /root/bin/sleepyhead:, que contém:

#!/bin/sh
## This file (or a link to it) must be in /lib/systemd/system-sleep/

# This is called when the lid is closed, as follows:
# $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=pre, $2=suspend
# ...and when the lid is opened, as follows:
# $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=post, $2=suspend


touch /tmp/sleepyrun
logger -t "sleepyhead" "Start: \$1=$1, \$2=$2"
if [ "$1" = "post" ] ; then
    action="RUN trackpoint in background"
    bash /root/bin/trackpoint >/tmp/trackpoint-run 2>&1
else
    action="NO ACTION"
fi
logger -t "sleepyhead" "${action}: " "\$1=$1, \$2=$2"

O /root/bin/trackpointscript segue. Observe que o primeiro sono é crítico. O dispositivo é configurado toda vez que a tampa é aberta, para que não exista inicialmente. Se eu tentar fazer qualquer coisa além de dormir, o script "dorminhoca" leva muito tempo para sair e meu ponteiro fica congelado por pelo menos 60 segundos. Além disso, observe que você não pode colocar o /root/bin/trackpointscript em segundo plano sleepyhead, acima. Se você o fizer, o processo será interrompido quando sleepyheadsair.

#!/bin/bash
# This is /root/bin/trackpoint

echo "Start $0"
date

found=false
dir=""
# dirlist can look like:
# /sys/devices/platform/i8042/serio1/serio25/speed
# /sys/devices/platform/i8042/serio1/serio24/speed
# ...the older one appears to get cleaned a little later.

sleep 1 # If I don't put this in here, my pointer locks up for a really long time...
for i in 1 2 3 4; do
    speedfiles=$(find /sys/devices/platform/i8042 -name speed) # There may be multiple speed files at this point.
    [ -z "$speedfiles" ] && { sleep 1; continue; }
    dirlist=$(dirname $speedfiles)
    printf "Speed file(s) at $(find /sys/devices/platform/i8042 -name speed | tail -1) \n"
    # All this remaking of the path is here because the filenames change with
    # every resume, and what's bigger: 9 or 10? ...Depends if you're
    # lexicographical or numerical. We need to always be numerical.
    largest_number="$(echo $dirlist | tr ' ' '\n' | sed -e 's/.*serio//' | sort -n | tail -1)"
    dir="$(echo $dirlist | tr ' ' '\n' | egrep serio${largest_number}\$ )"
    echo "Dir is $dir number is $largest_number" 
    [ -n "$dir" ] && found=true && break
done
$found || exit 1


date
echo -n 4 > $dir/inertia
echo -n 220 > $dir/sensitivity
echo -n 128 > $dir/speed
date
echo "Done $0"
Mike S
fonte
Muito bem organizado e documentado. Eu daria a você vários votos se pudesse!
MountainX-for-Monica