Eu sei que isso foi feito há um ano, mas encontrei algumas soluções. O primeiro usa powernap
e um script para verificar processos de execução específicos e pode ser encontrado aqui .
Segundo, vi on-line perguntas sobre o Linux . Isso usa pings para outra máquina.
Também exibi um roteador com o DD-WRT para testar o wrt wiki . Estas são soluções elegantes muito agradáveis, mas o problema que tive com elas é que elas não são adequadas para um servidor de mídia interno, porque o log captura apenas pacotes aceitos de fora da rede. Se você quer um servidor de mídia interno, isso simplesmente não funciona.
Para dd-wrt this oferece uma solução muito legal para isso usando VLANs. Basicamente coloque o servidor em sua própria sub-rede interna e monitore o tráfego para aquela VLAN, então o script anterior funciona. Isso funciona bem, mas na minha experiência o roteador e build do dd-wrt sempre que utilizei o recurso vlan do DHCP travou.
Decidi que queria uma solução para ativar e suspender meu servidor de mídia automaticamente quando acessado, o que não dependia de dd-wrt. Eu tenho um pi de framboesa, então eu usei isso. A solução final que encontrei para mim foi escrever um pequeno roteiro de bash.
As dependências do raspberry-pi são etherwake e tcpdump. Ambos não são instalados por padrão no rasbian.
sudo apt-get install etherwake
sudo apt-get install tcpdump
O script de ativação é o seguinte:
#!/bin/bash
pingInterval=60 #time interval, in seconds, between checks that the server is still awake.
target=192.168.x.x #WOL target ip address
targetMAC=00:11:22:33:44:55 #WOL target MAC
wake () {
tcpdump -i eth0 -c 1 -p host $target
etherwake $targetMAC
#echo WOL sent to $target at $targetMAC
return
}
while sleep $pingInterval; do
varPing='ping -s 1 -c 2 $target > /dev/null; echo $?'
if [ $varPing -eq 0 ]; then
#echo ping success
else
#echo ping fail
wake
fi
done
A idéia principal é que ele é executado a partir do meu pi-framboesa, que irá acordar o servidor se notar uma única solicitação arp para o servidor. Se o servidor estiver acordado, ele não estará ouvindo uma solicitação de arp, mas enviará alguns pings de vez em quando para ter certeza de que ainda está ativo.
Eu nomeei o arquivo wol.sh e o tornei executável. Em seguida, coloque-o no sudo crontab para iniciar o @reboot como root. Isso é para o tcpdump que precisa de acesso elevado para ouvir eth0 e etherwake.
sudo chmod +x /home/pi/wol.sh
sudo crontab -e
adicione isso ao final
@reboot sh /home/pi/wol.sh > /dev/null
O script de suspensão é executado a partir do servidor de mídia usando o mesmo princípio. Se não houver tráfego para o servidor (excluindo icmp ou arp) durante o intervalo de varredura, escolhi 1 minuto. Então acrescente a um contador que eu nomeei sonolência. Depois que a sonolência atingir 10 ou 20, ou seja, se não houver tráfego durante vinte minutos, então a sonolência é zerada, então emite o comando pm-suspend
para adormecer. Os pacotes são recebidos e sleepiness!=0
faz uma sonolência -1. Então, se ele captura um pacote perdido ou algum como você faz isso do roteador, ele não redefine a contagem de volta para zero, mas apenas faz um -1 no contador. Eu coloco isso lá porque ele permite que um período de graça caia suavemente enquanto os pacotes diminuem ao longo de um período de tempo, em vez de ter absolutamente zero pacotes por 20 minutos consecutivos.
Isso talvez não seja o melhor, porque ele precisa chamar o tcpdump em ambas as máquinas. Envolve gravações constantes no disco (do lado do servidor). Para as gravações em disco eu montei um usb sacrificial e é onde o meu arquivo de captura é salvo para evitar o desgaste do meu disco rígido real.