Desligamento do Intel NUC HTPC em ocioso

2

Estou executando um HTPC no Intel Nuc executando o Xenial. Quando pressiono o botão liga / desliga, ele executa o powerbtn.sh, que inicia o desligamento, mas meu framboesa é capaz de ativá-lo, como eu quero.

A questão é como eu faço para o Ubuntu executar isso quando estiver ocioso por 5 minutos. Os dois fatores que me preocupam é que o MythTV e o ssh não devem estar servindo naquele período de 10 minutos.

Acho que posso bloquear o SSH usando a solução aqui Prevent máquina de dormir quando as conexões SSH estão ativadas

Acredito que o MythTV deve ser considerado automaticamente pelo SO.

Mas como eu coloco tudo isso junto e faço funcionar?

Obrigado pelo seu tempo!

EDIT: Depois de pensar muito, eu criei este script que planejo executar no cron a cada 15 minutos. Qualquer sugestão será muito apreciada

#!/bin/bash

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

#check for MythTV sessions, and preventing suspending:
if [ "$(netstat -tun | grep :6543 | grep -i established | wc -l)" -gt 0 ]; then
    echo "MythTV  is still streaming. Not suspending."
    exit 1
fi

sleep 5m

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

#check for MythTV sessions, and preventing suspending:
if [ "$(netstat -tun | grep :6543 | grep -i established | wc -l)" -gt 0 ]; then
    echo "MythTV  is still streaming. Not suspending."
    exit 1
fi

echo "Safe to shutdown from MythTV and SSH"
/etc/acpi/powerbtn.sh
    
por coolarm 14.01.2018 / 23:45

1 resposta

0

Eu não consegui que os eventos do sistema MythTV funcionassem. Tentei o meu melhor jogando com permissões todas em vão. Aqui está o meu código de trabalho atual. Substitua as variáveis do banco de dados por suas configurações. Salve como diz /etc/cron.daily/idle_htpc.py Se qualquer um dos passos falhar, o programa será encerrado. Apenas sudo crontab -e isto para cada 5-59/15 * * * * /etc/cron.daily/idle_htpc.py /var/log/htpc_out 2> /var/log/htpc_err 15 minutos

Etapa 1: verifique se há alguma conexão SSH

Passo 2: Verifique se o vídeo ao vivo ou gravado está sendo reproduzido no momento. Se não dormir por 5 minutos

Passo 3: verifique novamente se o vídeo ao vivo ou gravado está sendo reproduzido no momento

Etapa 4: verifique se houve transmissão ao vivo nos últimos 5 minutos, caso haja um fluxo de menos de 5 minutos enquanto o script estava no Passo 2. No entanto, se houve uma reprodução gravada, não há como detectar aqui.

Etapa 5: Verifique a próxima gravação programada e se houver uma, e será > 5 minutos a partir de agora acione a ativação ACPI 3 minutos antes da hora de início e desligamento ou desmarque a ativação e o desligamento da ACPI.

Espero que isso ajude alguém.

#!/usr/bin/python3

import pymysql
import pymysql.cursors
from datetime import timedelta,datetime
import subprocess
import time
import sys

print ( datetime.now().strftime("%Y-%m-%d %H:%M:%S"), file=sys.stdout)

def check_Logins():
    #Returns the number of SSH connections
    #result= subprocess.run('who | grep -cv "(:"', stdout=subprocess.PIPE, shell=True)
    result= subprocess.run("netstat -n |grep tcp |grep ':22' |wc -l", stdout=subprocess.PIPE, shell=True)
    print ('Logins:'+result.stdout.decode('UTF-8'), file=sys.stdout)
    return (int(result.stdout.decode('UTF-8')))

def check_if_InUse():
    #Checks if a live stream or a previosuly recorded program is being served at this moment. If yes, non zero value is returned
    InUse=1
    connection = pymysql.connect(host=$host,
                             user=$username,
                             password=$password,
                             db=$db,
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

    try:
        with connection.cursor() as cursor:
            # Read a single record
            sql = "select count(*) from inuseprograms where recusage !='jobqueue' and recusage !='flagger'"
            cursor.execute(sql)
            result = cursor.fetchone()
            InUse = result["count(*)"]
    finally:
        connection.close()
    print ("Count: "+str(InUse), file=sys.stdout)
    return InUse

def check_live_5min():
    #Checks if there were any live streams served in last 5 minutes
    RecInUse_5min=1
    connection = pymysql.connect(host=$host,
                             user=$username,
                             password=$password,
                             db=$db,
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

    try:
        with connection.cursor() as cursor:
            # Read a single record
            sql = "select max(starttime) from recordedseek"
            cursor.execute(sql)
            result = cursor.fetchone()
            print ('Recent: ', result['max(starttime)'], file=sys.stdout)
            print ('Current: ',datetime.utcnow(), file=sys.stdout)
            if datetime.utcnow()-result['max(starttime)']>=timedelta(minutes=5):
                RecInUse_5min =0
    finally:
        connection.close()
    return RecInUse_5min

def get_next_rec():
    #Returns a tuple indicating if there is any scheduled recording if yes, how far into the future
    retdata = (True, timedelta(minutes=1))
    connection = pymysql.connect(host=$host,
                             user=$username,
                             password=$password,
                             db=$db,
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

    try:
        with connection.cursor() as cursor:
            # Read a single record
            sql = "select MIN(next_record) from record where recordid!=1 and next_record IS NOT NULL;"
            cursor.execute(sql)
            result = cursor.fetchone()
            if result['MIN(next_record)'] is None: #no scheduled recordings
                retdata= (False,timedelta(minutes=1))
            else:
                retdata= (True,result['MIN(next_record)']-datetime.utcnow())
    finally:
       connection.close()
    return retdata

if check_Logins()==0:
    print ('First check passed', file=sys.stdout)

    if check_if_InUse() == 0:
        print ('Second check passed', file=sys.stdout)
        time.sleep(5*60)

        if check_if_InUse() == 0:
            print ('Third check passed', file=sys.stdout)
            if check_live_5min()==0:
                print ('Fourth check passed', file=sys.stdout)
                (valid,upcoming) = get_next_rec()

                # Clear any previously set wakeup time 
                result = subprocess.run('echo 0 > /sys/class/rtc/rtc0/wakealarm',stdout=subprocess.PIPE,shell=True)
                print ('Clear:'+result.stdout.decode('UTF-8'), file=sys.stdout)

                if valid is True:
                    # Generate wakeup time string
                    upcoming = upcoming - timedelta(minutes=3)
                    wakeup_string="'+"+str(upcoming.days)+" days + "+str(max([int(upcoming.seconds/60)-3,0]))+" minutes'"
                    print ('Setting for '+wakeup_string, file=sys.stdout)
                    wakeup_command="echo 'date '+%s' -d " +wakeup_string+ "' > /sys/class/rtc/rtc0/wakealarm"
                    #Setup wakeup time
                    result = subprocess.run(wakeup_command,stderr=subprocess.PIPE, shell=True)
                    print ('Set:'+result.stderr.decode('UTF-8'), file=sys.stdout)
                    #Check if alarm is set. It should show the unix time stamp
                    result= subprocess.run('cat /sys/class/rtc/rtc0/wakealarm', stdout=subprocess.PIPE, shell=True)
                    print ('Check:'+result.stdout.decode('UTF-8'), file=sys.stdout)

                print ('Shutting down', file=sys.stdout)
                subprocess.Popen(['/sbin/shutdown', '-h', 'now'])
    
por coolarm 17.01.2018 / 23:38