プロセスまたはアプリケーションに時間制限を設定します
小さなバックグラウンドスクリプトを使用すると、プロセスまたはアプリケーションに時間制限を設定できます。
ユーザーが管理者のパスワードを知らない限り、簡単に超えられません。
以下の解決策
このような小さな背景スクリプトです。スクリプトの先頭に設定するために、1日あたりの使用量を定義された分数に制限します。一度設定すると(それほど難しくありません)、非常に簡単に実行でき、その後は追加のアクションは不要です。
スクリプト
#!/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秒に1回、スクリプトはターゲットプロセスが実行されているかどうかを確認します。その場合、合計使用量に「ポイント」が1つ追加され、ファイルに記録されます(
/opt/limit/uselog
)。1日の制限に達すると、スクリプトはプロセスの実行を許可せず、存在する場合は強制終了します。
- 日が変わると(日付はファイルに記録されるため、再起動は役に立たない)、ログファイルは削除され、新しい使用時間が蓄積されます。
- 以来のスクリプトが実行され、ブートアップから、
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
がわからない限り、何が起こっているのかを見つけるのは非常に困難です。これらの2つの手段の組み合わせにより、あなたの息子が気付く可能性は低くなります。
設定方法
2つの簡単な手順が含まれます。
以下のコードを空のファイルにコピーし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秒しかありません(画面が黒くなります)ので、彼は深刻な問題を抱えています。