ตั้งเวลา จำกัด ในกระบวนการหรือแอปพลิเคชัน
ด้วยสคริปต์พื้นหลังขนาดเล็กคุณสามารถตั้งเวลาในกระบวนการหรือแอพพลิเคชั่นได้
ตราบใดที่ผู้ใช้ของคุณไม่ทราบรหัสผ่านของผู้ดูแลระบบมันก็จะไม่ถูกข้ามได้ง่ายเกินไป
วิธีแก้ปัญหาด้านล่าง
เป็นสคริปต์พื้นหลังเล็ก ๆ มัน จำกัด การใช้งานต่อวันตามจำนวนนาทีที่กำหนดเพื่อตั้งไว้ในส่วนหัวของสคริปต์ เมื่อตั้งค่าแล้ว (ซึ่งไม่ยากเกินไป) จะทำงานได้ง่ายมากและไม่จำเป็นต้องดำเนินการใด ๆ เพิ่มเติมภายหลัง
บท
#!/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
นั้นจะกลายเป็นรูทและลบบรรทัด/etc/rc.local
ออกหรือจะหยุดสคริปต์ในลักษณะนั้นเราสามารถเผชิญหน้ากับปัญหาถัดไป: หน้าจอมืดลงหลังจากนั้น เข้าสู่ระบบนอกจากนี้โซลูชันจะตรวจสอบว่าสคริปต์พื้นหลังทำงานหลังจาก 5 นาทีหลังจากรีสตาร์ทหรือไม่หากไม่ทำงาน
มาตรการพิเศษคือการตรวจสอบ startup- ถ้าเส้น/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 วินาทีในการค้นหา (จากนั้นหน้าจอจะมืดลง) ดังนั้นเขาจะมีปัญหาร้ายแรงเว้นแต่ว่าเขาจะเป็นคนฉลาดมีประสบการณ์มากมายกับอูบุนตูและมีความคิดสร้างสรรค์