Đặt giới hạn thời gian cho một quy trình hoặc ứng dụng
Với một tập lệnh nền nhỏ, bạn có thể đặt giới hạn thời gian cho một quy trình hoặc ứng dụng.
Miễn là người dùng của bạn không biết mật khẩu của quản trị viên , nó không bị vượt quá dễ dàng.
Giải pháp dưới đây
Là một kịch bản nền nhỏ như vậy. Nó giới hạn việc sử dụng mỗi ngày ở một số phút xác định, để đặt vào phần đầu của tập lệnh. Sau khi thiết lập (không quá khó), nó sẽ chạy rất dễ dàng và không cần thực hiện thêm hành động nào sau đó.
Kịch bản
#!/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
Cách sử dụng
- Trên máy tính để bàn của bạn (hoặc bất cứ nơi nào khác), tạo một thư mục có tên:
limit
- Sao chép tập lệnh vào một tệp trống, lưu nó dưới dạng
limit_use
(không có phần mở rộng) trong thư mục và làm cho nó có thể thực thi được
Chỉnh sửa trong phần đầu của kịch bản tên quy trình để giới hạn và số phút tối đa được phép. Trong ví dụ:
#--- set the time limit below (minutes)
minutes = 1
#--- set the process name to limit below
app = "gedit"
Sao chép thư mục vào thư mục /opt
:
cp -r /path/to/limit /opt
Bây giờ chỉnh sửa /etc/rc.local
để làm cho kịch bản chạy nó như khi root
khởi động:
sudo -i gedit /etc/rc.local
Ngay trước dòng
exit 0
một dòng khác:
/opt/limit/limit_use &
Đó là nó
Khi ai đó cố gắng giết tập lệnh nền:

(hành động không được phép)
Giải trình; làm thế nào nó hoạt động
- Cứ sau 10 giây, tập lệnh sẽ xem xét nếu quá trình được nhắm mục tiêu đang chạy. Nếu vậy, nó "thêm" một "điểm" vào tổng mức sử dụng, sẽ được ghi lại trong một tệp (
/opt/limit/uselog
). Nếu đạt đến giới hạn hàng ngày, tập lệnh không còn cho phép tiến trình chạy, giết nó nếu nó tồn tại.
- Vào ngày thay đổi (ngày được ghi trong một tệp, vì vậy khởi động lại sẽ không giúp ích), tệp nhật ký sẽ bị xóa, cho phép tạo ra một lượng thời gian sử dụng mới.
- Vì tập lệnh chạy khi khởi động ,
rc.local
chỉ từ (các) người dùng có quyền sudo mới có thể dừng tập lệnh, ngay cả khi người dùng biết tên quy trình.
Dừng kịch bản
Trong trường hợp bạn muốn dừng tập lệnh, hãy sử dụng lệnh:
sudo kill "$(pgrep limit_use)"
Nhưng một lần nữa, bạn cần mật khẩu sudo để làm như vậy.
BIÊN TẬP
Mặc dù tập lệnh ở trên sẽ cung cấp một cách an toàn hợp lý để hạn chế việc sử dụng ứng dụng, như được đề cập bởi @Bytecommander, nhưng nó có thể được vượt qua, mặc dù không dễ dàng lắm. Sự kết hợp với biện pháp dưới đây sẽ khiến việc này rất khó xảy ra, trừ khi con trai bạn biết thiết lập và khá có kinh nghiệm với Linux / Ubuntu.
Biện pháp bổ sung
Một chút nữa từ một "giải pháp đơn giản", nhưng vẫn không quá khó để thiết lập là biện pháp bổ sung dưới đây. Nếu tội phạm bị nghi ngờ của chúng ta sẽ tìm hiểu kịch bản được gọi là từ /etc/rc.local
, sẽ quản lý để trở thành người chủ, và loại bỏ các dòng trong /etc/rc.local
, hoặc sẽ có thể để ngăn chặn kịch bản như vậy, chúng ta có thể đối đầu với anh ta với vấn đề tiếp theo: màn hình màu đen ra sau đăng nhập. Ngoài ra, giải pháp kiểm tra xem tập lệnh nền có chạy sau 5 phút sau khi khởi động lại hay không, nếu không.
Các biện pháp bổ sung là một tấm séc khởi động cùng win nếu dòng /opt/limit/limit_use &
hiện diện trong /etc/rc.local
, và một tấm séc sau 5 phút nếu kịch bản vẫn chạy. Vì tập lệnh chạy từ trình khởi chạy (ẩn khỏi Ứng dụng khởi động) trong /etc/xdg/autostart
nên sẽ khá khó để tìm hiểu điều gì đang xảy ra, trừ khi bạn biết cách thực hiện. Sự kết hợp của hai biện pháp này khiến con trai bạn không thể phát hiện ra, và nếu có, có lẽ không có gì ngăn cản được nó.
Làm thế nào để thiết lập
Hai bước đơn giản có liên quan:
Sao chép mã dưới đây vào một tệp trống, lưu nó như blackout.desktop
trên máy tính để bàn của bạn:
[Desktop Entry]
Name=not allowed
Exec=/bin/bash -c "sleep 15 && /usr/local/bin/blackout.py"
Type=Application
Terminal=false
NoDisplay=true
Sao chép tệp vào /etc/xdg/autostart
:
sudo cp /path/to/blackout.desktop /etc/xdg/autostart
Sao chép tập lệnh bên dưới vào một tệp trống, lưu nó như blackout.py
trên máy tính để bàn của bạn, làm cho tập tin thực thi và sao chép nó vào /usr/local/bin
:
cp /path/to/blackout.py /usr/local/bin
Kịch bản
#!/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()
Giải trình
Các trình khởi chạy trong /etc/xdg/autostart
sẽ khởi chạy một ứng dụng (trong trường hợp này là kiểm tra bảo mật bổ sung) cho tất cả người dùng. Điều này có thể được ghi đè cục bộ, nhưng bạn phải biết kiểm tra chạy. Bằng cách đưa dòng NoDisplay=true
vào launcher của chúng tôi, nó sẽ không xuất hiện cục bộ Startup Applications
, vì vậy mà không biết nó tồn tại, nó khó có thể được phát hiện.
Hơn nữa, con trai của bạn chỉ có 15 giây để tìm hiểu (sau đó màn hình bị tắt) vì vậy nó sẽ gặp vấn đề nghiêm trọng, trừ khi nó là một người tài giỏi, có nhiều kinh nghiệm với Ubuntu và một bộ óc sáng tạo.