Встановіть обмеження часу для процесу чи програми
За допомогою невеликого фонового сценарію ви можете встановити обмеження часу для процесу чи програми.
Поки ваш користувач не знає пароль адміністратора , його не можна легко перевершити.
Розчин нижче
Це такий невеликий фоновий сценарій. Він обмежує використання в день на певну кількість хвилин, встановлену в голові сценарію. Після встановлення (що не надто складно) це працює дуже легко, і ніяких додаткових дій після цього не потрібно.
Сценарій
#!/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
Як користуватись
- На робочому столі (або деінде) створіть папку з назвою:
limit
- Скопіюйте скрипт у порожній файл, збережіть його
limit_use
(без розширення) всередині папки та зробіть його виконуваним
Відредагуйте в голові сценарію назву процесу для обмеження та максимальну кількість дозволених хвилин. У прикладі:
#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"
Скопіюйте папку в каталог /opt
:
cp -r /path/to/limit /opt
Тепер відредагуйте, /etc/rc.local
щоб сценарій запускався як root
при запуску:
sudo -i gedit /etc/rc.local
Незадовго до лінії
exit 0
інший рядок:
/opt/limit/limit_use &
Це воно
Коли хтось намагається вбити фоновий сценарій:
(дія заборонена)
Пояснення; як це працює
- Раз на 10 секунд сценарій виглядає, якщо працює цільовий процес. Якщо це так, це "додає" одну "крапку" до загального використання, що записується у файл (
/opt/limit/uselog
). Якщо денний ліміт досягнуто, сценарій більше не дозволяє запускати процес, вбиваючи його, якщо він існує.
- Після зміни дня (дата записується у файл, тому перезавантаження не допоможе) файл журналу видаляється, що дозволяє наробити новий час використання.
- Оскільки сценарій працює під час завантаження ,
rc.local
лише користувачі (користувачі) з привілеями sudo можуть зупинити сценарій, навіть тоді, лише якщо користувач знає ім'я процесу.
Зупиніть сценарій
Якщо ви хочете зупинити сценарій, скористайтеся командою:
sudo kill "$(pgrep limit_use)"
Але знову ж таки для цього вам знадобиться пароль судо.
EDIT
Хоча вищезазначений сценарій повинен забезпечувати досить безпечний спосіб обмеження використання програми, як згадував @Bytecommander, його можна перевершити, хоча і не дуже легко. Поєднання із наведеним нижче заходом зробить дуже малоймовірним, що це станеться, якщо тільки ваш син не знає налаштування, і він не має досвіду роботи з Linux / Ubuntu.
Додатковий захід
Трохи далі від "простого рішення", але все-таки не надто складно встановити - це додатковий захід нижче. Якщо наш підозрюваний делінквент дізнається, що скрипт викликається /etc/rc.local
, вдасться увійти в корінь і видалить рядок /etc/rc.local
, або зможе зупинити сценарій таким чином, ми можемо зіткнутися з ним із наступною проблемою: екран чорніє після Крім того, рішення перевіряє, чи працює фоновий скрипт через 5 хвилин після перезавантаження, вимикаючи його, якщо ні.
Додатковий захід - це перевірка запуску, якщо рядок /opt/limit/limit_use &
присутній /etc/rc.local
, і перевірка через 5 хвилин, якщо сценарій все ще працює. Оскільки сценарій працює від (прихованого від програм запуску програм) запуску в /etc/xdg/autostart
ньому буде досить складно з'ясувати, що відбувається, якщо ви не знаєте, як це робиться. Поєднання цих двох заходів робить малоймовірним, що ваш син дізнається, і якщо він це зробить, напевно, нічого не зупинить його.
Як налаштувати
Два простих кроки:
Скопіюйте код нижче в порожній файл, збережіть його як blackout.desktop
на робочому столі:
[Desktop Entry]
Name=not allowed
Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
Type=Application
Terminal=false
NoDisplay=true
Скопіюйте файл у /etc/xdg/autostart
:
sudo cp /path/to/blackout.desktop /etc/xdg/autostart
Скопіюйте нижче скрипт у порожній файл, збережіть його як blackout.py
на робочому столі, зробіть його виконуваним та скопіюйте у /usr/local/bin
:
cp /path/to/blackout.py /usr/local/bin
Сценарій
#!/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()
Пояснення
Запускники /etc/xdg/autostart
запустять додаток (у цьому випадку додаткова перевірка безпеки) для всіх користувачів. Це може бути перезаписано локально, але ви повинні знати пробіжки перевірки. Помістивши лінію NoDisplay=true
в наш пусковий апарат, вона не з’явиться локально Startup Applications
, тому, не знаючи, що вона існує, вона навряд чи буде виявлена.
Крім того, у вашого сина є лише 15 секунд, щоб дізнатися (тоді екран затухає), щоб у нього виникли серйозні проблеми, якщо він не геніальний, має багато досвіду роботи з Ubuntu та творчим розумом.