Установите срок для процесса или приложения
С помощью небольшого фонового сценария вы можете установить ограничение по времени для процесса или приложения.
Пока ваш пользователь не знает пароль администратора , его не слишком легко превзойти.
Решение ниже
Является ли такой небольшой фоновый скрипт. Это ограничивает использование в день определенным количеством минут, чтобы установить в заголовке сценария. После настройки (что не так уж сложно) он работает очень легко, и после этого никаких дополнительных действий не требуется.
Сценарий
#!/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)"
Но опять же, для этого вам понадобится пароль sudo.
РЕДАКТИРОВАТЬ
Хотя приведенный выше сценарий должен обеспечить достаточно безопасный способ ограничения использования приложения, как упоминает @Bytecommander, его можно превзойти, хотя и не очень легко. Сочетание с показанным ниже показателем очень маловероятно, что это произойдет, если ваш сын не знает настройки и не имеет большого опыта работы с Linux / Ubuntu.
Дополнительная мера
Чуть дальше от «простого решения», но все же не слишком сложного в настройке, есть дополнительная мера ниже. Если наш подозреваемый правонарушитель обнаружит, что скрипт вызывается /etc/rc.local
, сможет стать пользователем root и удалить строку /etc/rc.local
, или сможет остановить скрипт таким образом, мы можем столкнуться с ним следующей проблемой: экран затемняется после Войдите в систему. Кроме того, решение проверяет, работает ли фоновый скрипт через 5 минут после перезапуска, а затем отключается.
Дополнительная мера является startup- проверить , если строка /opt/limit/limit_use &
присутствует в /etc/rc.local
, и проверка через 5 минут , если сценарий все еще работает. Поскольку скрипт запускается из средства запуска (скрытого от Startup Applications), /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()
объяснение
Launchers in /etc/xdg/autostart
запустит приложение (в данном случае дополнительная проверка безопасности) для всех пользователей. Это может быть перезаписано локально, но вы должны знать, какие проверки выполняются. Поместив линию NoDisplay=true
в нашу программу запуска, она не будет отображаться локально Startup Applications
, поэтому, не зная, что она существует, она вряд ли будет обнаружена.
Кроме того, у вашего сына есть только 15 секунд, чтобы узнать (затем экран затемняется), поэтому у него будут серьезные проблемы, если он не гениален, имеет большой опыт работы с Ubuntu и творческим умом.