Pesquisei um pouco isso e não consigo encontrar nada útil.
Eu tenho meu PC executando o Ubuntu 12.10 configurado para suspender após 30 minutos de inatividade. Não quero mudar isso, funciona muito bem na maioria das vezes.
O que eu quero fazer é desativar a suspensão automática se um aplicativo específico estiver em execução. Como posso fazer isso?
A coisa mais próxima que encontrei até agora é adicionar um script de shell no /usr/lib/pm-utils/sleep.d
qual verifica se o aplicativo está sendo executado e retorna 1 para indicar que a suspensão deve ser evitada. Mas parece que o sistema desiste de suspender automaticamente, em vez de tentar novamente após mais 30 minutos. (Pelo que sei, se eu mover o mouse, isso reiniciará o timer novamente.) É bem provável que o aplicativo termine após algumas horas, e prefiro que meu PC seja suspenso automaticamente se não estiver usando nesse ponto . (Portanto, não quero adicionar uma chamada para pm-suspende quando o aplicativo terminar.)
Isso é possível?
EDIT: Como observei em um dos comentários abaixo, o que eu realmente queria era inibir a suspensão quando meu PC estava servindo arquivos pelo NFS; Eu só queria me concentrar na parte "suspender" da pergunta, porque eu já tinha uma idéia de como resolver a parte do NFS. Usando a idéia do 'xdotool' dada em uma das respostas, criei o seguinte script, que corro a partir do cron a cada poucos minutos. Não é o ideal, pois impede que o protetor de tela seja ativado, mas funciona. Eu preciso dar uma olhada no porquê 'cafeína' não reativar corretamente a suspensão mais tarde, então provavelmente poderia fazer melhor. De qualquer forma, isso parece funcionar, então eu estou incluindo aqui caso alguém mais esteja interessado.
#!/bin/bash
# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity()
{
/usr/sbin/nfsstat --server --list
}
# Prevent the automatic suspend from kicking in.
function inhibit_suspend()
{
# Slightly jiggle the mouse pointer about; we do a small step and
# reverse step to try to stop this being annoying to anyone using the
# PC. TODO: This isn't ideal, apart from being a bit hacky it stops
# the screensaver kicking in as well, when all we want is to stop
# the PC suspending. Can 'caffeine' help?
export DISPLAY=:0.0
xdotool mousemove_relative --sync -- 1 1
xdotool mousemove_relative --sync -- -1 -1
}
LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"
echo "Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
check_activity > "$ACTIVITYFILE1"
exit 0;
fi
/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"
if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
echo "No activity detected since last run" >> "$LOG"
else
echo "Activity detected since last run; inhibiting suspend" >> "$LOG"
inhibit_suspend
fi
EDIÇÃO 2: O script acima funciona, mas graças a outro comentário abaixo, agora estou usando este par de scripts, que têm a vantagem de permitir que o protetor de tela seja ativado enquanto inibir a suspensão. O primeiro é /usr/lib/pm-utils/sleep.d/000nfs-inhibit, que impedirá uma tentativa de suspensão se existir um arquivo de inibição:
#!/bin/sh
LOG="/home/zorn/log/nfs-suspend-blocker.log"
INHIBITFILE="/home/zorn/tmp/nfs-suspend-blocker.inhibit"
echo "$0: Started run at $(date), arguments: $*" >> "$LOG"
if [ "$1" = "suspend" ] && [ -f "$INHIBITFILE" ]; then
echo "$0: Inhibiting suspend" >> "$LOG"
exit 1
fi
exit 0
A segunda é uma versão modificada do script nfs-suspend-blocker anterior e ainda deve ser executada a partir do cron. Agora, segue a estratégia descrita no comentário abaixo:
#!/bin/bash
# This works in tandem with /usr/lib/pm-utils/sleep.d/000nfs-inhibit, which
# will prevent a suspend occurring if $INHIBITFILE is present. Once it prevents
# a suspend, it appears that it requires some "user activity" to restart the
# timer which will cause a subsequent suspend attempt, so in addition to
# creating or removing $INHIBITFILE this script also jiggles the mouse after
# removing the file to restart the timer.
# If the output of this function changes between two successive runs of this
# script, we inhibit auto-suspend.
function check_activity()
{
/usr/sbin/nfsstat --server --list
}
# Slightly jiggle the mouse pointer about; we do a small step and reverse step
# to try to stop this being annoying to anyone using the PC.
function jiggle_mouse()
{
export DISPLAY=:0.0
xdotool mousemove_relative --sync -- 1 1
xdotool mousemove_relative --sync -- -1 -1
}
LOG="$HOME/log/nfs-suspend-blocker.log"
ACTIVITYFILE1="$HOME/tmp/nfs-suspend-blocker.current"
ACTIVITYFILE2="$HOME/tmp/nfs-suspend-blocker.previous"
INHIBITFILE="$HOME/tmp/nfs-suspend-blocker.inhibit"
echo "$0: Started run at $(date)" >> "$LOG"
if [ ! -f "$ACTIVITYFILE1" ]; then
check_activity > "$ACTIVITYFILE1"
exit 0;
fi
/bin/mv "$ACTIVITYFILE1" "$ACTIVITYFILE2"
check_activity > "$ACTIVITYFILE1"
if cmp --quiet "$ACTIVITYFILE1" "$ACTIVITYFILE2"; then
echo "$0: No activity detected since last run" >> "$LOG"
if [ -f "$INHIBITFILE" ]; then
echo "$0: Removing suspend inhibit file and jiggling mouse" >> "$LOG"
/bin/rm "$INHIBITFILE"
jiggle_mouse
fi
else
echo "$0: Activity detected since last run; inhibiting suspend" >> "$LOG"
touch "$INHIBITFILE"
fi
Respostas:
Um programa para manter seu computador acordado é a cafeína . Eu criaria um arquivo .bash_aliases para também chamar cafeína quando o código original for chamado.
Dependendo do código para o qual você está tentando manter o computador acordado, será necessário criar um script personalizado que inclua a interrupção da cafeína quando o outro código for parado. Mais alguns detalhes sobre o código específico ajudariam.
Atualização: Uma maneira mais simples seria executar o xdotool , que pode ser instalado com
sudo apt-get install xdotool
. Você pode escrever um script chamado quando o código de destino é aberto e, em seguida, usar osleep
comando por 29 minutos e executarxdotool key a
ou algo arbitrário para manter o computador acordado.fonte
E se
então por que não apenas apontar o ponteiro do mouse após o término do aplicativo?
Para resumir:
Isso não impedirá o protetor de tela.
O único problema é que serão 30 minutos após o término do processo quando o sistema for suspenso. Este é o caso da sua solução 'EDIT' também.
PS: Eu estava procurando uma solução para um problema semelhante quando soube do xdotool nesta página. Então obrigado. Espero que isto ajude.
fonte
pm-utils
ajudou. Observe que o pacotepm-utils
precisa ser instalado para que isso funcione - o próprio diretório pode existir mesmo que o pacote não esteja instalado.Embora a EDIT 2 permita que o protetor de tela inicie e reinicie o serviço de suspensão automática na remoção do arquivo de inibição, conforme observado acima, serão 30 minutos após a remoção do arquivo quando o sistema será suspenso.
Uma solução possível é desativar a funcionalidade de proteção automática de tela e suspensão automática incorporada e implementá-las por conta própria, e escolher o comportamento do cronômetro, conforme necessário. O comando xprintidle(pode ser necessário instalar isso) imprime o número de milissegundos para os quais não houve atividade de teclado ou mouse. Isso abre várias possibilidades. Eu implementei o seguinte gerenciador de inatividade em python (não é muito um script de bash). Os recursos incluem definir o comando, tempo limite e inibir o arquivo (eu chamei de bloqueio) para proteção de tela e / ou suspensão automática. Além disso, existe a opção de escolher se o timer de inatividade deve reiniciar quando o arquivo de inibição é removido ou não (o comportamento pode ser diferente para suspender e proteção de tela). Tentei esclarecer o uso nas notas, mas se algo não estiver claro, pergunte.
Uso:
inactivitymanager &
a .profile ou .xsessionrc no diretório inicial (veja qual funciona para você. Não adicione os dois; caso contrário, duas instâncias desse script serão executadas simultaneamente, algo que eu não lidei. Acho que está nesses detalhes que as implementações convencionais superam as personalizadas).Como o arquivo de inibição chega lá fica para a imaginação do usuário por enquanto (se eu me propuser a implementar um daemon para isso, colocarei isso em um EDIT para esta resposta). É claro que você (OP) resolveu o problema para o seu caso. Uma armadilha a evitar ao tentar inibir a suspensão por mais de um processo é excluir o arquivo de bloqueio quando um processo termina enquanto outro ainda está em execução. Como alternativa, o script pode ser editado levemente para inibir a suspensão, se houver algum arquivo em um diretório específico (um diretório de bloqueio). Dessa forma, cada processo pode ter seu próprio arquivo de bloqueio.
Notas:
fonte