Desligar depois de inativo (mas não se o servidor SAMBA estiver em uso)

1

Encontrei várias perguntas sobre isso, mas não consigo encontrar uma que atenda às minhas necessidades.

Eu gostaria que minha máquina (Xubuntu 16.04) desligasse se eu não a estivesse usando por 30 minutos. No entanto, eu uso para transmitir vídeos para o meu media center (através de um servidor SAMBA), então eu não quero que ele desligue nesse caso.

Todas as respostas que encontrei ignoram a atividade da rede e concentram-se apenas nos pressionamentos de teclas e movimentos do mouse.

    
por user2891462 04.09.2016 / 15:34

2 respostas

1

Eu configurei meu próprio cron job para lidar com isso.

O que alcancei

Suspendendo / desligando a máquina se ela estiver inativa (sem pressionamentos de teclas ou movimentos do mouse) por um determinado período de tempo, a menos que haja arquivos sendo acessados em seu servidor SAMBA.

Requisitos

  • root access.
  • xprintidle (instale-o executando em um terminal: sudo apt-get install xprintidle )

Como

  1. Salve o seguinte script em um local de sua escolha (no meu caso, /home/user/.useful-scripts/idle.sh ):

    #!/bin/bash
    
    # Checks the time the computer has been idle (no keystrokes or mouse moves)
    # If it's greater than the set limit, it will suspend the machine if no
    # files are being accessed through the SAMBA server.
    
    
    # The maximum number of milliseconds the computer is allowed to be idle before
    # it is suspended (set to 20 minutes)
    IDLE_LIMIT_MS=1200000
    
    # How long the machine has been idle for
    IDLE_TIME_MS=$(/sbin/runuser -l ic -c "DISPLAY=:0.0 /usr/bin/xprintidle")
    
    if [ $IDLE_TIME_MS -gt $IDLE_LIMIT_MS ] ;
    then
        # If there are no files locked by SAMBA, suspend the machine
        FILES_LOCKED=$(/usr/bin/smbstatus | /bin/grep 'Locked files:')
    
        if [[ -z "${FILES_LOCKED}" ]] ;
        then
            /bin/systemctl suspend -i
            # If you prefer to shut down instead of suspend, comment the
            # previous line and uncomment the following one:
            # /sbin/poweroff
        fi
    fi
    

    Esteja ciente de que este script será executado por cron . Isso tem certas implicações, mas principalmente que as variáveis de ambiente DISPLAY e PATH não estão definidas. Portanto, precisamos fornecer o caminho completo ao invocar um comando. Os caminhos podem mudar em sua máquina, portanto, verifique se eles correspondem à sua configuração (por exemplo, para encontrar o caminho para xprintidle executar em um terminal which xprintidle ).

    Também precisamos especificar o DISPLAY para o qual queremos as informações de xprintidle . É normalmente :0.0 , mas você pode ter certeza disso executando w de um terminal enquanto estiver logado e verificando a coluna FROM . Leia estes três links ( 1 , 2 e 3 ) para obter mais informações sobre PATH e DISPLAY em cron .

  2. Certifique-se de torná-lo executável:

      

    chmod + x /home/user/.useful-scripts/idle.sh

  3. Configure o trabalho para ser executado periodicamente usando cron . smbstatus precisa ser executado como root , por isso precisamos invocar crontab usando sudo :

      

    sudo crontab -e

    Adicione a seguinte linha para executar o script periodicamente:

      

    * * * * * /home/user/.useful-scripts/idle.sh

    Isso configura uma tarefa cron para ser executada a cada minuto e executar nosso script. Você pode configurar a periodicidade para um valor mais alto se não se importar com precisão menor (consulte este link para mais informações sobre a sintaxe necessária).

É isso. cron verificará o estado inativo da máquina a cada minuto e, se estiver ocioso por mais de 20 minutos (pode ser ajustado com a variável IDLE_LIMIT_MS ), ele se certificará de que nenhum arquivo esteja sendo acessado pelo servidor SAMBA ; nesse caso, ele suspenderá a máquina.

    
por user2891462 04.09.2016 / 22:08
1

Você pode executar o script de plano de fundo (muito baixo em sumo), que suspende o computador, arredondado em 10 segundos:

#!/usr/bin/env python3
import time
import subprocess

# --- set idle time below (seconds)
idle_set = 1200
# ---

def get_packets():
    return int([l.strip().split()[1].replace("packets:", "") for l in \
            subprocess.check_output("ifconfig").decode("utf-8").splitlines()\
            if " RX " in l][0])

def get_idle():
    return int(int(subprocess.check_output("xprintidle").decode("utf-8").strip())/1000)

data1 = get_packets()
t = 0

while True:
    time.sleep(10)
    data2 = get_packets()
    if data2 - data1 > 3000:
        t = 0
    else:
        t += 10
    idletime = get_idle()
    if all([idletime > idle_set, t > idle_set]):
        subprocess.Popen(["systemctl", "suspend", "-i"])
    data1 = data2

O que faz

  • Uma vez por 10 segundos, ele verifica a quantidade atual de dados recebidos , comparando-os com 10 segundos atrás (usando ifconfig ). Se exceder um determinado valor, o "contador" é definido como zero, senão a0 segundos é adicionado ao tempo de "stream".
  • Também uma vez a cada 10 segundos, o tempo ocioso "geral" é usado, usando xprintidle

Se ambos excederem o tempo definido (na cabeça do script), o computador será colocado em suspensão.

Como configurar

  1. O script precisa de xprintidle

    sudo apt-get xprintidle
    
  2. Copie o script em um arquivo vazio, salve-o como set_idle.py

  3. Na seção principal do script, defina o tempo ocioso desejado
  4. Teste-o pelo comando:

    python3 /path/to/set_idle.py
    

Se tudo funcionar bem, adicione-o aos aplicativos de inicialização.

Nota

Esta resposta assume que o tráfego é via conexão Ethernet. Se não, a função get_packets() possivelmente precisa de uma pequena edição.

    
por Jacob Vlijm 04.09.2016 / 22:36