Defina um limite de tempo em um processo ou aplicativo
Com um pequeno script de segundo plano, você pode definir um limite de tempo em um processo ou aplicativo.
Contanto que seu usuário não saiba a senha do administrador , ele não será ultrapassado com muita facilidade .
A solução abaixo
É um script de segundo plano pequeno. Ele limita o uso por dia a um número definido de minutos, para definir a cabeça do script. Uma vez configurado (o que não é muito difícil), é muito fácil, e nenhuma ação adicional é necessária depois.
O script
#!/usr/bin/python3
import subprocess
import os
import sys
import time
#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"
uselog = "/opt/limit/uselog"
datefile = "/opt/limit/currdate"
def read(f):
try:
return int(open(f).read().strip())
except FileNotFoundError:
pass
currday1 = read(datefile)
while True:
time.sleep(10)
currday2 = int(time.strftime("%d"))
# check if the day has changed, to reset the used quantum
if currday1 != currday2:
open(datefile, "wt").write(str(currday2))
try:
os.remove(uselog)
except FileNotFoundError:
pass
try:
# if the pid of the targeted process exists, add a "tick" to the used quantum
pid = subprocess.check_output(["pgrep", app]).decode("utf-8").strip()
n = read(uselog)
n = n + 1 if n != None else 0
# when time exceeds the permitted amount, kill the process
if n > minutes*6:
subprocess.Popen(["kill", pid])
open(uselog, "wt").write(str(n))
except subprocess.CalledProcessError:
pass
currday1 = currday2
Como usar
- Na sua área de trabalho (ou em qualquer outro lugar), crie uma pasta chamada:
limit
- Copie o script em um arquivo vazio, salve-o como
limit_use
(sem extensão) dentro da pasta e torne-o executável -
Edite na cabeça do script o nome do processo a ser limitado e o número máximo de minutos permitidos. No exemplo:
#--- set the time limit below (minutes) minutes = 1 #--- set the process name to limit below app = "gedit"
-
Copie a pasta para o diretório
/opt
:cp -r /path/to/limit /opt
-
Agora edite
/etc/rc.local
para fazer o script executá-lo comoroot
na inicialização:sudo -i gedit /etc/rc.local
Pouco antes da linha
exit 0
outra linha:
/opt/limit/limit_use &
É isso
Quando alguém tenta matar o script de fundo:
(ação não permitida)
Explicação; como funciona
- Uma vez por 10 segundos, o script será exibido se o processo segmentado estiver em execução. Em caso afirmativo, "adiciona" um "ponto" a um uso total, a ser registrado em um arquivo (
/opt/limit/uselog
). Se o limite diário for atingido, o script não permitirá mais a execução do processo, eliminando-o se existir. - Na alteração do dia (a data é gravada em um arquivo, portanto, a reinicialização não ajudará), o arquivo de log é excluído, permitindo que uma nova quantidade de tempo de uso seja acumulada.
- Como o script é executado em inicialização , de
rc.local
apenas usuário (s) com privilégios sudo pode parar o script, mesmo assim, somente se o usuário souber o nome do processo.
Pare o script
Caso você queira interromper o script, use o comando:
sudo kill "$(pgrep limit_use)"
Mas, novamente, você precisaria da senha do sudo para fazer isso.
EDITAR
Embora o script acima forneça uma maneira razoavelmente segura de limitar o uso de um aplicativo, como mencionado por @Bytecommander, ele pode ser ultrapassado, embora não seja muito fácil. A combinação com a medida abaixo tornará muito improvável que isso aconteça, a menos que seu filho conheça a configuração e seja bastante experiente com o Linux / Ubuntu.
Medida adicional
Um pouco mais longe de uma "solução simples", mas ainda não muito difícil de configurar, está a medida adicional abaixo. Se nosso delinquente suspeito descobrir que o script é chamado de /etc/rc.local
, conseguiria se tornar root e remover a linha em /etc/rc.local
, ou seria capaz de Para parar o script dessa forma, podemos confrontá-lo com o próximo problema: a tela escurece após o login. Além disso, a solução verifica se o script de segundo plano está em execução após 5 minutos após a reinicialização, tornando-se apagado.
A medida extra é uma inicialização - verifique se a linha /opt/limit/limit_use &
está presente em /etc/rc.local
, e uma verificação após 5 minutos se o script ainda estiver em execução. Como o script é executado a partir de um iniciador (oculto de aplicativos de inicialização) em /etc/xdg/autostart
, será muito difícil descobrir o que está acontecendo, a menos que você saiba como isso é feito. A combinação dessas duas medidas faz com que seja improvável que seu filho descubra, e se isso acontecer, provavelmente nada o impedirá.
Como configurar
Dois passos simples estão envolvidos:
-
Copie o código abaixo em um arquivo vazio, salve-o como
blackout.desktop
em sua área de trabalho:[Desktop Entry] Name=not allowed Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py" Type=Application Terminal=false NoDisplay=true
Copie o arquivo para
/etc/xdg/autostart
:sudo cp /path/to/blackout.desktop /etc/xdg/autostart
-
Copie o script abaixo em um arquivo vazio, salve-o como
blackout.py
em sua área de trabalho, torne-o executável e copie-o para/usr/local/bin
:cp /path/to/blackout.py /usr/local/bin
O script
#!/usr/bin/env python3 import subprocess import time def dim_screen(): screen = [ l.split()[0] for l in subprocess.check_output(["xrandr"]).decode("utf-8").splitlines()\ if " connected" in l ] for scr in screen: subprocess.Popen(["xrandr", "--output", scr, "--brightness", "0"]) if not "/opt/limit/limit_use &" in open("/etc/rc.local").read(): dim_screen() time.sleep(300) try: pid = subprocess.check_output(["pgrep", "limit_use"]).decode("utf-8").strip() except subprocess.CalledProcessError: dim_screen()
Explicação
Os lançadores em /etc/xdg/autostart
iniciarão um aplicativo (nesse caso, o check-up extra de segurança) para todos os usuários. Isso poderia ser sobregravado localmente, mas você precisa conhecer as execuções de check-up. Colocando a linha NoDisplay=true
em nosso lançador, ele não aparecerá localmente em Startup Applications
, portanto, sem saber que existe, é improvável que seja descoberto.