设置流程或应用程序的时间限制
使用小的后台脚本,您可以为进程或应用程序设置时间限制。
只要您的用户不知道管理员的密码,就不会轻易超过它。
下面的解决方案
就是这么小的背景脚本。它将每天的使用量限制为定义的分钟数,以在脚本的开头进行设置。设置完成(这不太困难),它运行起来非常容易,此后无需采取其他任何措施。
剧本
#!/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分钟后检查后台脚本是否正在运行,如果没有,则将其涂黑。
额外的措施是启动-检查行中/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有着丰富的经验,并且富有创造力。