Impedir que a máquina durma quando as conexões SSH estiverem ativadas


13

Estou tentando economizar energia alternando as áreas de trabalho para o modo de suspensão quando estão inativas. Mas muitos desktops também são acessados ​​via SSH por seus proprietários. Existe uma solução wakeonlan implantada para permitir que os proprietários liguem a máquina, mas o problema é que as máquinas serão suspensas automaticamente novamente em 10 minutos, mesmo com a conexão SSH ativada.

O que estou tentando fazer é incluir as sessões SSH ativas nas definições de "atividade".

A questão é: isso pode ser feito através da definição de uma regra polkit? Isso pode ser feito colocando um script que é executado antes da suspensão real e anula-o se forem encontradas sessões SSH? Eu preciso de uma maneira limpa e legítima de fazer isso. Caso contrário, as formas hacky também são bem-vindas.

Solução hacky ingênua atual: editar /usr/sbin/pm-suspend:

#check for SSH sessions, and prevent suspending:
if [ "$(who | grep -cv "(:")" -gt 0 ]; then
    echo "SSH session(s) are on. Not suspending."
    exit 1
fi

Isso serve ao propósito. Mas não sei quando uma atualização substituirá o arquivo /usr/sbin/pm-suspend. Também não sei como isso funcionará com outras implementações de suspensão, como o tuxonice.


2
Posso sugerir o uso em grep -cv :0vez de passar wc?
terdon 8/09/14

1
Outra idéia para obter mais elegância: você pode descartar a invocação de [se você escrever if who | grep -qv :0; then(supondo que você tenha um POSIX em conformidade grepcomo GNU grep).
David Foerster

Respostas:


19

Até o Ubuntu 14.10 (baseado no Upstart)

Dê uma olhada pm-action(8)e procure /etc/pm/sleep.dna seção "ARQUIVOS". Se um desses scripts retornar com um status de saída diferente de zero, a suspensão será impedida.

Instruções atualizadas para maior clareza:

  1. Então crie um arquivo /etc/pm/sleep.d/05_ssh_keepawake.

  2. Coloque um shebang ( #!/bin/sh) e o código mencionado na pergunta neste arquivo.

  3. Defina as permissões de execução:

    chmod +x /etc/pm/sleep.d/05_ssh_keepawake
    

Desde o Ubuntu 15.04 (baseado em systemd)

O systemd não usa o pm-utils para gerenciar seus ganchos de estado de energia, mas possui sua própria infraestrutura para o mesmo fim. Os verificadores inibidores de sono não são mais executados durante o sono, mas devem ser definidos pela ação que inibe o sono (consulte 1 ).

Como tal, você teria que adicionar comandos ao logon e logout da sessão SSH que registram um inibidor de sono no systemd (por exemplo, via systemd-inhibit(1)) e depois liberam o inibidor. Se alguém souber como conectar-se ao logon e logout do SSH, eu gostaria de receber um comentário ou edição para que possamos elaborar as etapas e comandos relevantes.

A seção a seguir está em andamento - Use-a somente quando souber o que está fazendo!

Você pode escrever uma unidade systemd /etc/systemd/system/ssh-inhibt-sleep.serviceque se torne dependente do sleep.targetuso da RequiredByopção Se sua nova unidade falhar (com um status de saída diferente de zero do processo chamado), ela fará sleep.targete, portanto, a ação de suspensão subsequente.

[Unit]
Description=Check for running SSH sessions and, if any, inhibit sleep
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c '! who | grep -qv :0'`

[Install]
RequiredBy=sleep.target

Como sempre, você precisa ativar as unidades systemd para que elas entrem em vigor:

sudo systemctl enable ssh-inhibt-sleep.service

Para mais informações, consulte systemd.unit(5)e systemd.service(5).


isso não parece funcionar em 18.04. Isso não é mais a solução?
Michael Jarret

1
@ MichaelJarret: De fato. Atualizei minha pergunta com algumas informações sobre a situação com o systemd.
David Foerster

Encontrei o seguinte ao tentar resolver isso ontem, mas não consegui modificar o script anterior para fazer o trabalho aqui
Michael Jarret

Não consigo editar meu comentário, mas isso também parece relevante #
Michael Jarret

1
@ MichaelJarret: Eu tive outra ideia que você poderia tentar. Veja a atualização para minha resposta.
David Foerster
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.