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.
fonte
grep -cv :0
vez de passarwc
?[
se você escreverif who | grep -qv :0; then
(supondo que você tenha um POSIX em conformidadegrep
como GNU grep).Respostas:
Até o Ubuntu 14.10 (baseado no Upstart)
Dê uma olhada
pm-action(8)
e procure/etc/pm/sleep.d
na 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:
Então crie um arquivo
/etc/pm/sleep.d/05_ssh_keepawake
.Coloque um shebang (
#!/bin/sh
) e o código mencionado na pergunta neste arquivo.Defina as permissões de execução:
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.service
que se torne dependente dosleep.target
uso daRequiredBy
opção Se sua nova unidade falhar (com um status de saída diferente de zero do processo chamado), ela farásleep.target
e, portanto, a ação de suspensão subsequente.Como sempre, você precisa ativar as unidades systemd para que elas entrem em vigor:
Para mais informações, consulte
systemd.unit(5)
esystemd.service(5)
.fonte