Establecer un límite de tiempo en un proceso o aplicación
Con un pequeño script de fondo, puede establecer un límite de tiempo en un proceso o aplicación.
Siempre que su usuario no conozca la contraseña del administrador , no se la supera con demasiada facilidad.
La solución a continuación
Es un script de fondo tan pequeño. Limita el uso por día a un número definido de minutos, para establecer en el encabezado del script. Una vez configurado (que no es demasiado difícil), es muy fácil y no se necesita ninguna acción adicional después.
La secuencia de comandos
#!/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
Cómo utilizar
- En su escritorio (o en cualquier otro lugar), cree una carpeta llamada:
limit
- Copie el script en un archivo vacío, guárdelo como
limit_use
(sin extensión) dentro de la carpeta y hágalo ejecutable
Edite en el encabezado del script el nombre del proceso a limitar y el número máximo de minutos permitidos. En el ejemplo:
#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"
Copie la carpeta al directorio /opt
:
cp -r /path/to/limit /opt
Ahora edite /etc/rc.local
para que el script lo ejecute como root
en el inicio:
sudo -i gedit /etc/rc.local
Justo antes de la línea
exit 0
otra linea:
/opt/limit/limit_use &
Eso es
Cuando alguien intenta matar el script de fondo:
(acción no permitida)
Explicación; cómo funciona
- Una vez cada 10 segundos, el script busca si el proceso de destino se está ejecutando. Si es así, "agrega" un "punto" al uso total, que se registrará en un archivo (
/opt/limit/uselog
). Si se alcanza el límite diario, el script ya no permite que se ejecute el proceso, eliminándolo si existe.
- En el cambio del día (la fecha se registra en un archivo, por lo que reiniciar no ayudará), el archivo de registro se elimina, lo que permite acumular una nueva cantidad de tiempo de uso.
- Dado que la secuencia de comandos se ejecuta al arrancar ,
rc.local
solo los usuarios con privilegios de sudo pueden detener la secuencia de comandos, incluso si el usuario conoce el nombre del proceso.
Detener el guión
En caso de que quiera detener el script, use el comando:
sudo kill "$(pgrep limit_use)"
Pero nuevamente, necesitaría la contraseña de sudo para hacerlo.
EDITAR
Aunque la secuencia de comandos anterior debería proporcionar una forma razonablemente segura de limitar el uso de una aplicación, como lo menciona @Bytecommander, puede superarse, aunque no con mucha facilidad. La combinación con la medida a continuación hará que sea muy poco probable que esto suceda, a menos que su hijo conozca la configuración y tenga bastante experiencia con Linux / Ubuntu.
Medida adicional
Un poco más lejos de una "solución simple", pero aún no es demasiado difícil de configurar es la medida adicional a continuación. Si nuestro presunto delincuente descubriera que se llama al script /etc/rc.local
, lograría convertirse en root y eliminaría la línea /etc/rc.local
, o sería capaz de detener el script de esa manera, podemos confrontarlo con el siguiente problema: la pantalla se apaga después inicie sesión. Además, la solución verifica si la secuencia de comandos en segundo plano se está ejecutando después de 5 minutos después del reinicio, apagándose si no.
La medida adicional es un cheque startup si la línea /opt/limit/limit_use &
está presente en /etc/rc.local
, y un cheque después de 5 minutos si el guión todavía funciona. Dado que el script se ejecuta desde un iniciador (oculto de las aplicaciones de inicio) /etc/xdg/autostart
, será bastante difícil descubrir qué está sucediendo, a menos que sepa cómo se hace. La combinación de estas dos medidas hace que sea poco probable que su hijo se entere, y si lo hace, probablemente nada lo detendrá.
Como instalar
Hay dos pasos simples involucrados:
Copie el siguiente código en un archivo vacío, guárdelo como blackout.desktop
en su escritorio:
[Desktop Entry]
Name=not allowed
Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
Type=Application
Terminal=false
NoDisplay=true
Copie el archivo a /etc/xdg/autostart
:
sudo cp /path/to/blackout.desktop /etc/xdg/autostart
Copie el script a continuación en un archivo vacío, guárdelo como blackout.py
en su escritorio, hágalo ejecutable y cópielo en /usr/local/bin
:
cp /path/to/blackout.py /usr/local/bin
La secuencia de comandos
#!/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()
Explicación
Los iniciadores /etc/xdg/autostart
iniciarán una aplicación (en este caso, el control de seguridad adicional) para todos los usuarios. Esto podría sobrescribirse localmente, pero debe conocer las ejecuciones de verificación. Al poner la línea NoDisplay=true
en nuestro lanzador, no aparecerá localmente Startup Applications
, por lo que sin saber que existe, es poco probable que se descubra.
Además, su hijo tiene solo 15 segundos para averiguarlo (luego la pantalla se oscurece), por lo que tendría un problema grave, a menos que sea un genio, tenga mucha experiencia con Ubuntu y una mente creativa.