Não tenho certeza, mas você já tentou systemd-inhibit
? Ele funciona em caixas Linux em execução no systemd (sendo o Ubuntu 16.04 um deles, o AFAIK).
Veja as páginas de manual, man systemd-inhibit
para ajuda.
Recentemente eu executei um script de longa duração que iniciei a partir de uma janela do Terminal no Ubuntu 16.04 x64. Quando saí do sistema, ele foi suspenso automaticamente após os 20 minutos em que eu tinha configurado na janela System Settings
, que tinha o efeito de pausar o script. Quando voltei ao sistema, percebi que várias horas de progresso na execução do meu script foram perdidas porque o sistema havia sido suspenso.
Uma solução alternativa é selecionar manualmente Don't suspend
na janela Power
de configurações escolhida em System Settings
. Este método para evitar a suspensão é insatisfatório (1), porque muitas vezes esqueço de fazê-lo e (2) porque me faz subserviente ao meu sistema.
Talvez exista uma forma mais simples, mas ainda assim manual, de fazer isso com algum tipo de comando prefix, que chamarei nosuspend
por enquanto, com esse uso: nosuspend python myscript.py arg1 arg2
. Minha queixa principal com esse comando mítico é que ele ainda requer que eu me lembre de usá-lo e, como não é razoável prefixar todos os comandos do terminal, é preciso prever se um script levará 1 minuto ou 1 hora para ser executado, e essa previsão pode estar incorreto, levando novamente à perda de tempo e à frustração.
Idealmente, a solução impediria a suspensão até que todos os comandos fossem executados a partir de uma janela do Terminal concluída. Em algum nível, percebo que isso é impossível, pois um processo bash dentro da janela do Terminal pode ter um subprocesso que talvez não queiramos impedir, por exemplo, sudo su
executado em uma janela do Terminal ainda está em execução, embora não possamos estar atualmente usando-o e, portanto, está ocioso, mas ainda queremos que o sistema seja suspenso automaticamente após 20 minutos, digamos. Então, há um problema de definir critérios para suspender.
Devo observar que o script Python em questão tinha apenas disco esporádico, rede e quase nenhum trabalho de CPU, já que repetia chamadas de time.sleep () do Python de até menos de um minuto por chamada. Portanto, não estou particularmente procurando por métodos que detectem apenas um estado "razoavelmente" inativo no disco, na rede ou na CPU. Talvez haja uma maneira de detectar se um comando que é um subprocesso do Terminal fez algum progresso em todos os durante um intervalo (esperamos que o mesmo intervalo configurado em Power
acima). Espero que isso possa distinguir meu script do exemplo anterior de idle sudo su
.
Atualização 1 (14 de setembro de 2016):
Como recomendado por Adrine Correya abaixo, eu tentei systemd-inhibit
, que soa como o imaginado nosuspend
acima, mas não funcionou. Aqui está o que eu fiz. Primeiro criei um script de teste do Python chamado "long-job.py":
#!/usr/bin/python3
import time
print("starting")
for i in range(10):
time.sleep(10)
print("epoch", i)
print("all done")
Depois, tornei-o executável usando chmod +x long-job.py
. Para acelerar o teste, defino org>gnome>settings-daemon>plugins>power>sleep-inactive-ac-timeout
para 20 (segundos) usando dconf-editor
(instalado via Software Ubuntu). Em seguida, executei o script, sem root / sudo, usando systemd-inhibit ./long-job.py
, mas o sistema ainda entrava no modo de suspensão antes que o trabalho fosse concluído (deveria levar cerca de 100 segundos para ser executado, mas o sono ocorreu após 20 segundos). Eu também tentei algumas das opções ( --what="sleep"
e --what="idle"
), mas ainda não funcionou. De acordo com a página do manual, o padrão é --what="idle:sleep:shutdown"
.
Atualização 2 (14 de setembro de 2016):
No Mac OS X, parece que caffeinate
implementa a ideia nosuspend
acima; veja link . Mais uma vez, seria bom automatizá-lo, para que não precisemos adivinhar quais tarefas podem ser executadas por muito tempo. Além disso, é necessária uma versão do Ubuntu.
Não tenho certeza, mas você já tentou systemd-inhibit
? Ele funciona em caixas Linux em execução no systemd (sendo o Ubuntu 16.04 um deles, o AFAIK).
Veja as páginas de manual, man systemd-inhibit
para ajuda.
Eu escrevi um programa keepawake.py que pode monitorar a atividade de cpu, o tráfego de rede e a atividade do usuário (mouse / teclado). Isso pode resolver seu problema. Eu postei aqui no AskUbuntu ...
Existe alguma maneira de fazer o Ubuntu não suspender enquanto um download está em andamento?
Se o seu script de longa duração causar algum tráfego na rede ou disparar uma determinada porcentagem da atividade da CPU, o programa acima poderá resolver o seu problema.