Legen Sie ein Zeitlimit für einen Prozess oder eine Anwendung fest
Mit einem kleinen Hintergrundskript können Sie ein Zeitlimit für einen Prozess oder eine Anwendung festlegen.
Solange Ihr Benutzer das Administratorkennwort nicht kennt , wird es nicht zu leicht überschritten.
Die Lösung unten
Ist so ein kleines Hintergrundskript. Es begrenzt die Nutzung pro Tag auf eine festgelegte Anzahl von Minuten, die im Kopf des Skripts festgelegt werden. Einmal eingerichtet (was nicht allzu schwierig ist), läuft es sehr einfach, und danach sind keine weiteren Maßnahmen erforderlich.
Das Drehbuch
#!/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
Wie benutzt man
- Erstellen Sie auf Ihrem Desktop (oder anderswo) einen Ordner mit dem Namen:
limit
- Kopieren Sie das Skript in eine leere Datei, speichern Sie es als
limit_use
(keine Erweiterung) im Ordner und machen Sie es ausführbar
Bearbeiten Sie im Kopf des Skripts den zu beschränkenden Prozessnamen und die maximal zulässige Anzahl von Minuten. Im Beispiel:
#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"
Kopieren Sie den Ordner in das Verzeichnis /opt
:
cp -r /path/to/limit /opt
Bearbeiten Sie /etc/rc.local
nun das Skript, damit es root
beim Start wie folgt ausgeführt wird:
sudo -i gedit /etc/rc.local
Kurz vor der Linie
exit 0
eine andere Zeile:
/opt/limit/limit_use &
Das ist es
Wenn jemand versucht, das Hintergrundskript zu beenden:
(Aktion nicht erlaubt)
Erläuterung; wie es funktioniert
- Das Skript prüft einmal pro 10 Sekunden, ob der Zielprozess ausgeführt wird. In diesem Fall wird der Gesamtnutzung ein "Punkt" hinzugefügt, der in einer Datei aufgezeichnet werden soll (
/opt/limit/uselog
). Wenn das Tageslimit erreicht ist, lässt das Skript die Ausführung des Prozesses nicht mehr zu und beendet ihn, falls vorhanden.
- Bei der Änderung des Tages (das Datum wird in einer Datei aufgezeichnet, sodass ein Neustart nicht hilfreich ist) wird die Protokolldatei gelöscht, sodass eine neue Nutzungsdauer aufgebaut werden kann.
- Da das Skript beim Hochfahren ausgeführt wird , können
rc.local
nur Benutzer mit sudo-Berechtigungen das Skript stoppen, auch wenn der Benutzer den Prozessnamen kennt.
Stoppen Sie das Skript
Wenn Sie das Skript anhalten möchten, verwenden Sie den folgenden Befehl:
sudo kill "$(pgrep limit_use)"
Aber auch hier benötigen Sie das sudo-Passwort.
BEARBEITEN
Obwohl das obige Skript eine einigermaßen sichere Möglichkeit zur Einschränkung der Verwendung einer Anwendung bieten sollte, wie von @Bytecommander erwähnt, kann es übertroffen werden, wenn auch nicht sehr einfach. Die Kombination mit der folgenden Maßnahme macht es sehr unwahrscheinlich, dass dies geschieht, es sei denn, Ihr Sohn kennt das Setup und ist mit Linux / Ubuntu recht erfahren.
Zusätzliche Maßnahme
Etwas weiter von einer "einfachen Lösung" entfernt, aber dennoch nicht zu schwierig einzurichten, ist die folgende zusätzliche Maßnahme. Wenn unser Verdacht delinquent des Skript aus aufgerufen wird , finden würde /etc/rc.local
, würde verwalten root werden, und entfernen Sie die Zeile in /etc/rc.local
, oder wäre in der Lage , das Skript zu stoppen auf diese Weise kann wir ihn mit dem nächsten Problem konfrontieren kann: der Bildschirm schwarz nach Melden Sie sich an. Zusätzlich überprüft die Lösung, ob das Hintergrundskript 5 Minuten nach dem Neustart ausgeführt wird, andernfalls wird es schwarz.
Die zusätzliche Maßnahme ist eine Startüberprüfung, ob die Zeile /opt/limit/limit_use &
vorhanden ist /etc/rc.local
, und eine Überprüfung nach 5 Minuten, ob das Skript noch ausgeführt wird. Da das Skript von einem (von Startup Applications ausgeblendeten) Startprogramm ausgeführt /etc/xdg/autostart
wird, ist es schwierig, herauszufinden, was gerade passiert, es sei denn, Sie wissen, wie es ausgeführt wird. Die Kombination dieser beiden Maßnahmen macht es unwahrscheinlich, dass Ihr Sohn es herausfindet, und wenn er es tut, wird ihn wahrscheinlich nichts aufhalten.
Wie stellt man das ein
Es sind zwei einfache Schritte erforderlich:
Kopieren Sie den folgenden Code in eine leere Datei und speichern Sie ihn blackout.desktop
auf Ihrem Desktop:
[Desktop Entry]
Name=not allowed
Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
Type=Application
Terminal=false
NoDisplay=true
Kopieren Sie die Datei nach /etc/xdg/autostart
:
sudo cp /path/to/blackout.desktop /etc/xdg/autostart
Kopieren Sie das unten stehende Skript in eine leere Datei, speichern Sie es blackout.py
auf Ihrem Desktop, machen Sie es ausführbar und kopieren Sie es nach /usr/local/bin
:
cp /path/to/blackout.py /usr/local/bin
Das Drehbuch
#!/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()
Erläuterung
Starter in /etc/xdg/autostart
starten eine Anwendung (in diesem Fall die zusätzliche Sicherheitsüberprüfung) für alle Benutzer. Dies könnte lokal überschrieben werden, aber Sie müssen die Überprüfungsläufe kennen . Wenn Sie die Zeile NoDisplay=true
in unseren Launcher einfügen, wird sie nicht lokal in Startup Applications
angezeigt. Ohne zu wissen, dass sie vorhanden ist, ist es unwahrscheinlich, dass sie entdeckt wird.
Außerdem hat Ihr Sohn nur 15 Sekunden Zeit, um das herauszufinden (dann ist der Bildschirm schwarz), sodass er ein ernstes Problem haben würde, es sei denn, er ist ein Genie, hat viel Erfahrung mit Ubuntu und einen kreativen Kopf.