Impostare un limite di tempo per un processo o un'applicazione
Con un piccolo script in background, è possibile impostare un limite di tempo per un processo o un'applicazione.
Finché l'utente non conosce la password dell'amministratore , non viene superato troppo facilmente.
La soluzione qui sotto
È uno script di sfondo così piccolo. Limita l'utilizzo al giorno a un numero definito di minuti, da impostare nell'intestazione dello script. Una volta installato (il che non è troppo difficile) si esegue molto facilmente e non sono necessarie ulteriori azioni in seguito.
Il copione
#!/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
Come usare
- Sul desktop (o in qualsiasi altro luogo), crea una cartella denominata:
limit
- Copia lo script in un file vuoto, salvalo come
limit_use
(nessuna estensione) all'interno della cartella e rendilo eseguibile
Modifica nell'intestazione dello script il nome del processo da limitare e il numero massimo di minuti consentiti. Nell'esempio:
#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"
Copia la cartella nella directory /opt
:
cp -r /path/to/limit /opt
Ora modifica /etc/rc.local
per far funzionare lo script come root
all'avvio:
sudo -i gedit /etc/rc.local
Poco prima della linea
exit 0
un'altra linea:
/opt/limit/limit_use &
Questo è tutto
Quando qualcuno tenta di uccidere lo script in background:
(azione non consentita)
Spiegazione; come funziona
- Una volta ogni 10 secondi, lo script verifica se il processo di destinazione è in esecuzione. In tal caso, "aggiunge" un "punto" a un utilizzo totale, da registrare in un file (
/opt/limit/uselog
). Se viene raggiunto il limite giornaliero, lo script non consente più l'esecuzione del processo, uccidendolo se esiste.
- Alla modifica del giorno (la data viene registrata in un file, quindi il riavvio non aiuta), il file di registro viene eliminato, consentendo l'accumulo di una nuova quantità di tempo di utilizzo.
- Poiché lo script viene eseguito all'avvio ,
rc.local
solo gli utenti con privilegi sudo possono interrompere lo script, anche solo se l'utente conosce il nome del processo.
Ferma la sceneggiatura
Nel caso in cui desideri interrompere lo script, utilizzare il comando:
sudo kill "$(pgrep limit_use)"
Ma ancora una volta, per farlo dovrai avere la password sudo.
MODIFICARE
Sebbene lo script sopra dovrebbe fornire un modo ragionevolmente sicuro di limitare l'utilizzo di un'applicazione, come menzionato da @Bytecommander, può essere superato, anche se non molto facilmente. La combinazione con la misura seguente renderà molto improbabile che ciò accada, a meno che tuo figlio non conosca l'installazione ed abbia una certa esperienza con Linux / Ubuntu.
Misura aggiuntiva
Un po 'più lontano da una "soluzione semplice", ma ancora non troppo difficile da configurare è la misura aggiuntiva di seguito. Se il nostro sospetto delinquente scopre da dove viene chiamato lo script /etc/rc.local
, riuscirà a diventare root e rimuoverà la linea /etc/rc.local
, o sarebbe in grado di fermare lo script in quel modo, possiamo affrontarlo con il prossimo problema: lo schermo si oscura dopo accedi. Inoltre, la soluzione verifica se lo script in background è in esecuzione dopo 5 minuti dopo il riavvio, in caso contrario oscura.
La misura in più è un controllo startup se la linea /opt/limit/limit_use &
è presente in /etc/rc.local
, e un controllo dopo 5 minuti se lo script viene eseguito ancora. Poiché lo script viene eseguito da un programma di avvio (nascosto dalle applicazioni di avvio) /etc/xdg/autostart
, sarà abbastanza difficile scoprire cosa sta succedendo, a meno che non si sappia come è fatto. La combinazione di queste due misure rende improbabile che tuo figlio lo scoprirà e, se lo fa, probabilmente nulla lo fermerà.
Come impostare
Sono previsti due semplici passaggi:
Copia il codice qui sotto in un file vuoto, salvalo come blackout.desktop
sul desktop:
[Desktop Entry]
Name=not allowed
Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
Type=Application
Terminal=false
NoDisplay=true
Copia il file in /etc/xdg/autostart
:
sudo cp /path/to/blackout.desktop /etc/xdg/autostart
Copia lo script seguente in un file vuoto, salvalo come blackout.py
sul desktop, rendilo eseguibile e copialo in /usr/local/bin
:
cp /path/to/blackout.py /usr/local/bin
Il copione
#!/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()
Spiegazione
I lanciatori in /etc/xdg/autostart
avvieranno un'applicazione (in questo caso il controllo di sicurezza aggiuntivo) per tutti gli utenti. Questo potrebbe essere sovrascritto localmente, ma devi conoscere le esecuzioni di controllo. Inserendo la linea NoDisplay=true
nel nostro launcher, non apparirà localmente in Startup Applications
, quindi senza sapere che esiste, è improbabile che venga scoperto.
Inoltre, tuo figlio ha solo 15 secondi per scoprirlo (quindi lo schermo è oscurato), quindi avrebbe un problema serio, a meno che non sia un genio, abbia molta esperienza con Ubuntu e una mente creativa.