Embora o 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, como observado acima, serão 30 minutos após o arquivo ser removido quando o sistema for suspenso.
Uma solução possível é desabilitar a funcionalidade de autocromoção de tela e suspensão automática embutida e implementá-la por nossa conta e escolher o comportamento do cronômetro conforme necessário. O comando xprintidle (talvez você tenha que 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 de um script bash). Os recursos incluem a configuração do comando, o tempo limite e o arquivo de inibição (chamado bloqueio) para proteção de tela e / ou suspensão automática. Além disso, existe a opção de escolher se o temporizador de inatividade deve reiniciar quando o arquivo de inibição é removido ou não (o comportamento pode ser diferente para a suspensão e o protetor de tela). Eu tentei deixar claro o uso nas notas, mas se algo não estiver claro, pergunte.
#!/usr/bin/python
#Notes:##################
# 1. All TIMEOUTs are specified in seconds
# 2. 0 or negative TIMEOUT disables a particular action.
# 3. If an actionCOMMAND (like pm-suspend) requires 'sudo'ing, make them 'sudo'able without password. Alternatively, you may run this script in sudo mode, and make this script sudoable without password. https://sobrelinux.info/questions/25/how-do-i-run-specific-sudo-commands-without-a-password"gnome-screensaver-command --lock && xset -display :0.0 +dpms dpms force off"
autosuspendCOMMAND = "gnome-screensaver-command --lock && sudo pm-suspend"
screensaverTIMEOUT = 10*60
autosuspendTIMEOUT = 20*60
screensaverLOCK = HOME + ".inactivitymanager/screensaverLOCK"
autosuspendLOCK = HOME + ".inactivitymanager/autosuspendLOCK"
screensaver_timer_starts_only_after_lockfile_is_deleted = False
autosuspend_timer_starts_only_after_lockfile_is_deleted = False
#########################
def stayOn():
print "inactivitymanager is running..."
try:
while True:
time.sleep(10)
except:
print "Closed."
class inactivity_action(threading.Thread):
def __init__(self, command, timeout, lock, timer_starts_blah):
threading.Thread.__init__(self)
self.daemon = True
self.command = command
self.timeout = timeout
self.lock = lock
self.timer_starts_blah = timer_starts_blah
def run(self):
if not(self.timer_starts_blah):
while True:
try:
while True:
time.sleep(1)
f = open(self.lock, 'r')
f.close()
except IOError:
xidletime = int(subprocess.Popen('xprintidle', stdout = subprocess.PIPE).communicate()[0])/1000
if xidletime > self.timeout:
os.system(self.command)
else:
time.sleep(self.timeout - xidletime + 2)
else:
lockremovetime = 0
while True:
lockdetected = False
try:
while True:
time.sleep(1)
f = open(self.lock, 'r')
f.close()
lockdetected = True
except IOError: #Will enter this section if/when lockfile is/becomes absent
xidletime = int(subprocess.Popen('xprintidle', stdout = subprocess.PIPE).communicate()[0])/1000
if lockdetected:
lockremovetime = int(time.time())
timesincelockremove = int(time.time()) - lockremovetime
if min(xidletime, timesincelockremove) > self.timeout:
os.system(self.command)
if screensaverTIMEOUT > 0:
inactivity_screensaver = inactivity_action(screensaverCOMMAND, screensaverTIMEOUT, screensaverLOCK, screensaver_timer_starts_only_after_lockfile_is_deleted)
inactivity_screensaver.start()
if autosuspendTIMEOUT > 0:
inactivity_autosuspend = inactivity_action(autosuspendCOMMAND, autosuspendTIMEOUT, autosuspendLOCK, autosuspend_timer_starts_only_after_lockfile_is_deleted)
inactivity_autosuspend.start()
stayOn()
Uso:
- Basta adicionar
inactivitymanager &
a .profile ou .xsessionrc no diretório inicial (veja qual deles funciona para você. Não inclua ambos, senão duas instâncias desse script serão executadas simultaneamente, algo que eu não manipulei. acho que é nesses detalhes que as implementações tradicionais superam as personalizadas).
- Você pode ter que instalar o xprintidle.
Como o arquivo de inibição chega lá é deixado para a imaginação do usuário por enquanto (se eu me forçar a implementar um daemon para isso, colocarei isso em um EDIT nesta resposta). Você (OP), é claro, resolveu o problema para o seu caso. Uma armadilha a ser evitada ao tentar inibir a suspensão em 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 modificado para inibir a suspensão se algum arquivo existir em um diretório específico (um diretório de bloqueio). Dessa forma, cada processo pode ter seu próprio arquivo de bloqueio.
Notas:
- Este script é bastante leve no processador e na memória. Mas remover o time.sleep (1) s no código pode causar problemas - ainda não foi verificado.
- pm-suspend requer permissões sudo. Para pm-suspender sem dar checkout de senha Como eu executo comandos sudo específicos sem uma senha? . Alternativamente, você pode executar este script no modo sudo, e fazer este script sudoable sem senha (Não é um problema se você está executando o script como root)
- O script pode ter problemas se os tempos limite estiverem definidos para menos de ~ 10 segundos (não sei onde exatamente o problema começa deve ser menor que 5, eu acho). Isso pode ser resolvido removendo algum time.sleep (1) s às custas dos recursos do sistema. Não pense que alguém precisará disso.
- Porque nós temos um controle sobre os timers, nenhum mousejiggles é necessário!