Quero executar um comando quando o usuário ficar inativo (o sistema está ocioso). Por exemplo:
echo "You started to be inactive."
Além disso, quando o usuário se torna ativo novamente (o sistema não está mais ocioso):
echo "You started to be active, again."
Eu preciso de um script de shell que faça isso. Isso é possível sem um temporizador / intervalo? Talvez alguns eventos do sistema?
Respostas:
Esse tópico nos fóruns do ArchLinux contém um pequeno programa C que consulta o xscreensaver para obter informações sobre quanto tempo o usuário está ocioso, e isso parece bem próximo dos seus requisitos:
Salve isso
getIdle.c
e compile compara obter um arquivo executável
getIdle
. Este programa imprime o "tempo ocioso" (o usuário não se move / clica com o mouse, não usa o teclado) em milissegundos, portanto, um script bash que se baseia nele pode ter a seguinte aparência:Isso ainda precisa de pesquisas regulares, mas faz tudo o que você precisa ...
fonte
xprintidle
, que está disponível na maioria das distribuições e faz exatamente a mesma coisa.O TMOUT no bash encerrará uma sessão interativa após o número de segundos definido. Você pode usar esse mecanismo.
Você pode capturar o logout configurando uma armadilha de acordo (não testei isso) ou usando os scripts bash-logout (~ / .bash_logout).
Aqui está uma boa resposta do superusuário nessa direção.
fonte
$TMOUT
segundos.EXIT
armadilha ou de.bash_logout
.Isso não é exatamente o que você solicitou, mas sempre existe o
batch
comando-(geralmente uma chamada especial doat
comandoatd
-e usando o -daemon).batch
permite que você solicite a execução de um comando quando a média de carga cair abaixo de um determinado limite (geralmente 1,5, mas isso pode ser definido ao iniciaratd
). Comat
isso, também é possível contratar um emprego de tal maneira que, em vez de ser executado em um determinado momento; o trabalho acaba de ser entreguebatch
naquele momento e é executado pela primeira vez quando a média de carga cai (por exemplo, é executada assim que a média de carga cai para menos de 1,5 em algum momento após as 02:00).Infelizmente, um trabalho em lotes será executado até o fim; não será interrompido se o computador não estiver mais ocioso.
+++
Se você tem que ir a programação de rota (que parece que a partir de outras respostas), eu acho que eu iria tentar fazer algo semelhante ao
atd
oucrond
daemons, que monitorava os usuários conectados e / ou média-carga. Este daemon pode então executar scripts / programas a partir de um determinado diretório e iniciar / continuar ou pará-los (com sinais), conforme necessário.fonte
.lock
arquivos, poderá lidar facilmente com problemas de tempo.Esse encadeamento possui algumas soluções baseadas na detecção de atividade do teclado e do mouse. Eu corro
xprintidle
de um trabalho cron que começa a cada poucos minutos. Mas, como eles apontamxprintidle
, não é mantida, convém instalar o módulo Perl e usá-lo:Eu usaria qualquer solução pesquisando a partir do cron, em um script que sai na parte superior se a interface do usuário não estiver suficientemente inativa. Claro que o script precisaria de um
export DISPLAY=:0.0
para conversar com o X11.Lembre-se de que o teclado e o mouse podem ficar inativos ao assistir a um filme ou ao executar uma tarefa com muita CPU.
fonte
Não conheço uma maneira de fazer isso sem pesquisar algum tipo de estatística do sistema, como as outras respostas que usam um protetor de tela ou um cronômetro inativo, ou executando a partir de .bash_logout, mas aqui está uma idéia para verificar o uso da CPU.
Isso ainda envolveria sondagens a cada n segundos, e se o uso da CPU estiver abaixo da quantidade que você escolher, poderá criar o script do que deseja executar. No entanto, o que quer que você execute pode aumentar o uso da CPU, mas você pode usar bem suas "coisas" para não contar.
Aqui está um script de teste usando top, mas você pode usar o mpstat ou verificar as médias de carga?
Esse é apenas um script que eu montei para testar a leitura da ociosidade de cima. Você pode analisar,
/proc/stat
mas acho que mostra apenas o tempo total e é necessário comparar os resultados ao longo de um intervalo. O Top tem seu próprio problema para mim (linux mint 16); na primeira execução, ele parece nunca mudar o cpustats, como se tivesse que esperar para analisar / proc / stat em si, portanto,top -bn2
mas na teoriatop -bn1
deveria funcionar.fonte
w
comando que mostra o tempo ocioso do usuário. - Pelo jeito que não estou julgando, é só isso para mim, quero detectar inatividade para colocar a máquina em repouso, para poupar energia, e as pesquisas vão contra isso.