Diferença entre suspender por echo “mem” / sys / power / state e por suspender no XFCE?

1

Eu tenho um serviço personalizado (trivial) que é executado no currículo do ACPI S3 ("suspender"), o script simplesmente ativa um servidor por WOL (Wake On LAN).

Isso é controlado pelo systemd, o script reside em /etc/systemd/system/on_resume.service e foi adicionado por:

chmod +x on_resume.service
systemctl enable on_resume.service
systemctl status on_resume.service

O problema é que o script é executado apenas quando o sistema é colocado em suspensão usando o widget "Suspender" no XFCE (um simples botão de um menu).

Se eu fizer eco "mem" > / sys / power / state, o sistema também é colocado em suspensão, mas o serviço não é executado quando o sistema é ligado novamente.

Em ambos os casos, simplesmente pressiono o botão de energia para trazê-lo de volta.

A questão é, qual é a diferença entre esses dois métodos de colocar o sistema no S3, se houver algum? Por que o systemd só executa o script ao usar o recurso do XFCE?

Para simplificar, suponha que o script tenha o seguinte conteúdo simples (esse script específico foi usado para teste e tem exatamente o mesmo problema, portanto, é uma versão mínima para reproduzir o problema):

#!/bin/sh

case "$1" in
        thaw|resume)
                echo "test" > /tmp/testfile_resume
                ;;
esac

exit 0

Eu bloqueio a tela através do "power manager" do XFCE quando o sistema é colocado em suspensão, no entanto, eu tentei desligar isso, e ele ainda funciona usando o botão "Suspend" do XFCE.

Eu então tentei comparar o syslog ao usar o widget e usar o sistema de arquivos sys manualmente, mas parece que não há nada lá para indicar uma falha ou qualquer coisa digna de nota que se destaque.

Qual é a diferença?

Note que eu realmente não me importo em termos de funcionalidade, eu estou perfeitamente bem usando um botão em vez de digitar o comando, mas eu quero entender o porquê.

    
por AttributedTensorField 24.08.2017 / 21:23

1 resposta

2

TL; DR: você quer usar systemctl suspend .

/sys/power/state é a API do kernel que o XFCE chama no final.

As APIs do Kernel não executam scripts de gancho. Software quer ser capaz de ligar para executar comandos antes de suspender (assim como depois de currículo). Portanto, a abordagem mais simples é ter um programa que execute hooks suspensos, chamadas no kernel e, em seguida, execute hooks de reinicialização.

Sendo este o Linux, vários desses programas foram escritos ao longo do tempo. systemd é atualmente o mais proeminente.

Detalhes técnicos

XFCE ou systemctl suspend - > systemd-logind - > systemd - > systemd-sleep - > kernel do linux.

É possível conectar-se a isso de maneiras diferentes, em cada um dos três links diferentes que iniciam systemd :). Seu script em /etc é executado por algo instalado em um dos dois últimos. Veja man systemd-sleep e man systemd.special . Infelizmente, as formas exatas de usar esses ganchos não estão documentadas muito bem agora. (O nível do systemd em particular precisa de um pouco de amor).

Quanto ao primeiro gancho possível: o sistema logind "inhibitor" é destinado para uso por aplicativos GUI . Envolve receber sinais DBus.

    
por 24.08.2017 / 21:37