web-dev-qa-db-ja.com

子供の計算時間を制限するにはどうすればよいですか?

私たちのコンピューター(インターネットへのアクセスだけでなく)へのアクセスは、子供(7、8)が自分で管理できる年齢になるまで、そのアカウントに対して制限する必要があります。それまでは、以下を定義できる必要があります。

  • コンピューティングが1日のうち何時間か(例:午後5時から9時)
  • コンピューティングがOKではない曜日(例:月曜日から金曜日)
  • 1日あたりの許容時間(例:2時間)

11.10では、ジョブを実行するために使用されていた次のすべてが機能しなくなりました。

  • Timekpr :11.10を超える場合、ppaを介して利用できなくなります。
  • タイムアウト :コマンドラインの代替ですが、11.10からリポジトリから削除されました
  • Gnome Nanny :素晴らしく見えますが、繰り返しクラッシュし、Xサーバーを強制的に再起動します。そのため、現時点ではこのプログラムを使用または推奨できません。

他の選択肢はありますか?

60
Takkat

ロック画面タイマー

systray.gif

サードパーティアプリケーションの代わりに独自の画面ロックタイマーを作成する

これを行うサードパーティアプリケーションがありますが、独自のアプリケーションを作成できます。手順の概要:

  • geditを使用してスクリプトlock-screen-timerを作成します
  • このウィンドウからコードをコピーしてlock-screen-timerに貼り付けます
  • lock-screen-timerを実行可能としてマークする
  • 試して!
  • Nautilusを構成してbashスクリプトを実行する
  • デスクトップショートカットリンクを作成する
  • 残り時間を監視する

geditを使用してスクリプトlock-screen-timerを作成します

を使用してTerminalを開きます Ctrl+Alt+T そしてタイプ:

gedit lock-screen-timer

下のウィンドウからコードをコピーしてlock-screen-timerに貼り付けます

この画面に戻り、次のコードをハイライトしてコピーを押してコピーします Ctrl+C

#!/bin/bash

# NAME: lock-screen-timer
# PATH: $HOME/bin
# DESC: Lock screen in x minutes
# CALL: Place on Desktop or call from Terminal with "lock-screen-timer 99"
# DATE: Created Nov 19, 2016. Last revision Mar 22, 2018.
# UPDT: Updated to support WSL (Windows Subsystem for Linux)
#       Remove hotplugtv. Replace ogg with paplay.

# NOTE: Time defaults to 30 minutes.
#       If previous version is sleeping it is killed.
#       Zenity is used to pop up entry box to get number of minutes.
#       If zenity is closed with X or Cancel, no screen lock timer is launched.
#       Pending lock warning displayed on-screen at set intervals.
#       Write time remaining to ~/.lock-screen-timer-remaining

MINUTES="$1" # Optional parameter 1 when invoked from terminal.

# if no parameters set default MINUTES to 30
if [ $# == 0 ]; then
    MINUTES=30
fi

DEFAULT="$MINUTES" # When looping, minutes count down to zero. Save deafult for subsequent timers.

# Check if lock screen timer already running
pID=$(pgrep -f "${0##*/}") # All PIDs matching lock-screen-timer name
PREVIOUS=$(echo "$pID" | grep -v ^"$$") # Strip out this running copy ($$$)
if [ "$PREVIOUS" != "" ]; then
    kill "$PREVIOUS"
    rm ~/.lock-screen-timer-remaining
    zenity --info --title="Lock screen timer already running" --text="Previous lock screen timer has been terminated."
fi

# Running under WSL (Windows Subsystem for Linux)?
if cat /proc/version | grep Microsoft; then
    WSL_running=true
else
    WSL_running=false
fi


while true ; do # loop until cancel

    # Get number of minutes until lock from user
    MINUTES=$(zenity --entry --title="Lock screen timer" --text="Set number of minutes until lock" --entry-text="$DEFAULT")

    RESULT=$? # Zenity return code
    if [ $RESULT != 0 ]; then
        break ; # break out of timer lock screen loop and end this script.
    fi

    DEFAULT="$MINUTES" # Save deafult for subsequent timers.
    if [[ $MINUTES == 0 ]] || [[ $MINUTES == "" ]]; then
        break ; # zero minutes considered cancel.
    fi

    # Loop for X minutes, testing each minute for alert message.
    (( ++MINUTES )) 
    while (( --MINUTES > 0 )); do
        case $MINUTES in 1|2|3|5|10|15|30|45|60|120|480|960|1920)
            notify-send --urgency=critical --icon=/usr/share/icons/gnome/256x256/status/appointment-soon.png "Locking screen in ""$MINUTES"" minute(s)." ;
            if [[ $WSL_running == true ]]; then  
                powershell.exe -c '(New-Object Media.SoundPlayer "C:\Windows\Media\notify.wav").PlaySync();'
            else
               paplay /usr/share/sounds/freedesktop/stereo/complete.oga ;
            fi
           ;;
        esac;

        # Record number of minutes remaining to file other processes can read.
        echo "$MINUTES Minutes" > ~/.lock-screen-timer-remaining

        sleep 60

    done

    rm ~/.lock-screen-timer-remaining # Remove work file others can see our progress with

    if [[ $WSL_running == true ]]; then  
        # Call lock screen for Windows 10
        rundll32.exe user32.dll,LockWorkStation
    else
        # Call screen saver lock for Unbuntu versions > 14.04.
        dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    fi

done # End of while loop getting minutes to next lock screen

exit 0 # Closed dialog box or "Cancel" selected.

次に、空のgeditウィンドウに戻って、コードを貼り付けます Ctrl+V。ファイルを保存し、エディターを終了してコマンドプロンプトに戻ります。

lock-screen-timerを実行可能としてマークする

次のように入力して、スクリプトを実行可能にする必要があります。

chmod +x lock-screen-timer

試して!

GUIからスクリプトを呼び出す前に、端末からスクリプトを呼び出して、エラーメッセージが表示されるかどうかを確認します。

~/lock-screen-timer

分数の入力を求められます:

Lock Screen Timer

目的の分数を設定し、[OK]をクリックしてタイマーを開始します。 15分、10分、5分、3分、2分、1分残っていると、システムサウンドが聞こえ、画面がロックされるタイミングを知らせるメッセージバブルが表示されます。画面がロックされたら、パスワードを入力して画面のロックを解除する必要があります。

Nautilusを構成してbashスクリプトを実行する

Nautilusは、ファイル表示ウィンドウまたはデスクトップ上のリンクである実行可能スクリプトをダブルクリックしたときの動作を定義します。通常の動作では、geditを使用してスクリプトを編集します。この動作が実行されるように変更したいのです。

Nautilusを起動し、lock-screen-timerを含むディレクトリに移動します。一度左クリックして、フォーカスを合わせます。 「ファイル編集...」メニューが表示されるまでマウスをトップメニューバーに合わせ、以下を使用します:

  1. Editドロップダウンメニューをクリックします
  2. Propertiesオプションをクリックします
  3. Behaviorタブをクリックします
  4. Executable Text Filesの下のラジオオプションボタンを確認します
  5. ラジオボタンRun executable text files when they are openedを確認します

デスクトップショートカットリンクを作成する

前のセクションからlock-screen-timerはまだフォーカスがあります。そうでない場合は、スクリプトに移動し、スクリプトを1回左クリックしてフォーカスを与えます。次に使用します:

  • ファイルを右クリックすると、コンテキストメニューオプションが表示されます。
  • メニューからMake Linkを選択します。
  • Link to lock-screen-timerという新しいアイコンが表示されます。
  • 新しいアイコンを左クリックして、Nautilusからデスクトップにドラッグします。

デスクトップショートカットリンクをダブルクリックすると、スクリプトが実行されます。分数を取得するダイアログボックスが表示されます。 2つのボタンが表示されます Cancel そして OKXをクリックしてウィンドウを閉じると、選択と同じになります Cancel

タイマーの実行後、もう一度ダブルクリックすると、最初に実行されているコピーが「強制終了」されます。新しいスクレンロックカウントダウンを開始するか、クリックすることができます Cancel カウントダウンなし。

システムトレイ/通知領域の残り時間を表示する

ロック画面タイマーの実行中、ファイルに残っている時間を記録します~/.lock-screen-timer-remainingwatchコマンドでこのファイルを見るか、この回答の上部に示すようにUbuntuのシステムトレイ/アプリケーションインジケーターバーに表示できます。通知領域に残っている時間を表示するには、このQ&Aの指示に従ってください:( BASHはアプリケーションインジケーターとしてsystrayに表示できますか? )。

1

TimeKpr

必要なものはすべて揃っていると思います。ユーザーごとの1日あたりのアクセス時間の制限、設定の簡単なGUI、1日間のバイパスの許可、「報酬時間」の追加、ユーザーの残り時間の通知など。

プロジェクトページは here です。また、ソフトウェアソースに追加できるubuntuのPPAもあります:deb http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu lucid main。そして、Software CenterまたはCLIを介してインストールします:Sudo apt-get install timekpr

11
Decio Lira

Timekpr

次の行を/etc/pam.d/lightdmに追加することにより、LightDMを実行する11.10でユーザーの制限を設定するために使用できます

account required pam_time.so

bug#83531 が修正されるまで、ユーザーの切り替えを有効にするためにlibpam-smbpassを削除する必要があるかもしれません。

アプリケーションウィンドウで定義されたすべての制限は、timekpr GUIで定義されたとおりに機能します。

Unityでtimekpr-clientアイコンを表示するには、Unityパネルの設定で whitelist'timekpr'を実行する必要があり、さらに/etc/xdg/autostart/timekpr-client.desktopの次の行にUnityを追加する必要があります。

OnlyShowIn=GNOME;XFCE;KDE;Unity;

許可された時間のカウントダウンを開始するには、timekprデーモンを開始する必要があります。

/etc/init.d/timekpr start

14.04の場合:

Timekprの新しいリリース/フォークが、Ubuntu 14.04用に Eduards Bezverhijsppa:mjasnik/ppaで公開されました。

8
Takkat

自動ログオフは、何かの途中にいると非常にイライラします。それは暴力的で、残忍で、無礼です。そして、あなたが何歳であっても関係ありません。あなたがただコンピューター中毒になっているときの一つのことであり、あなたがその送信ボタンをクリックするか、ドキュメントを保存する前に時間を追跡し、5秒追い出されるとき、それは非常に異なります。自動キッカーの代わりに自動アラームの使用を検討することをお勧めします。それはあなたの子供にお互いを尊重し、お互いが喜んでコンピュータを使うことを教えるでしょう。

さらに軽い代替品もあります。各子供がコンピュータを使用して費やした時間を追跡することから始めて、収集したデータをすべての人が利用できるようにします。この信じられないほど簡単なこと(インターネットの帯域幅に適用)だけで、私は大人でいっぱいのオフィスでネットワーク管理者をしていたときに私の命を救いました。各コンピューターの帯域幅使用量に関する一般的な統計(バイト数であり、訪問したサイトのリストなどの匿名化情報ではない)は、状況を「私-悪意のある貪欲な管理者-悪用された貧しいオフィスユーザー」から「男、あなたは私より5倍ダウンロードした、それは悪い!」 「申し訳ありませんが、実際にダウンロードしました。昼休みに多くのYouTubeを視聴しましたが、このレートではもうやめません」-私は対立シナリオから単に除外されました。

7
vh1

私もこの問題を抱えていました。そこで、使用時間と合計を定義できるkidtimerスクリプトを作成しました。プロジェクトは、Githubの次の場所にあります。

これは、それをインストールして使用する方法です。

  1. コードをコピーして、kidtimer.installというファイルに貼り付けます。

    #!/bin/bash
    # Restrict kids computer access to specific hours and total time.
    # By: Michael Groves - grover66_at_gmail_dot_com
    
    #variables
    basedir="/usr/local/kidtimer"
    configdir="/etc/kidtimer"
    Cdate=`/bin/date | awk '{ print $2" "$3 }'`
    TUI=0
    HOUR=`/bin/date +%H`
    DOW=`/bin/date +%u`
    WEEKEND="no"
    [ "$DOW" == "6" ] && WEEKEND="yes"
    [ "$DOW" == "7" ] && WEEKEND="yes"
    
    #arguments
    [ $# -eq 0 ] && TUI=1
    [ $# -eq 1 ] && COMMAND=$1
    [ $# -eq 2 ] && COMMAND=$1 && KID=$2
    [ $# -eq 3 ] && COMMAND=$1 && KID=$2 && Time=$3
    
    ################# Subroutines ##################
    ################################################
    
    go_check_install () {
    if [ ! -e $basedir ]; then
        go_initialize
    fi
    }
    
    
    go_initialize () {
    /bin/mkdir -p $basedir/time
    /bin/mkdir -p $basedir/schedule
    /bin/cp $0 /usr/local/bin/kidtimer && chmod +x /usr/local/bin/kidtimer
    echo "0 * * * *     root    /usr/local/bin/kidtimer hourly" > /etc/cron.d/kidtimer
    echo "0 0 * * *     root    /usr/local/bin/kidtimer daily" >> /etc/cron.d/kidtimer
    echo "* * * * *     root    /usr/local/bin/kidtimer check" >> /etc/cron.d/kidtimer
    echo "@reboot       root    /usr/local/bin/kidtimer daily" >> /etc/cron.d/kidtimer
    echo "@reboot       root    /usr/local/bin/kidtimer hourly" >> /etc/cron.d/kidtimer
    /bin/mkdir $configdir
    /usr/bin/touch $configdir/kid.list
    go_create_message_files
    echo "Kidtimer is now installed. Run /usr/local/bin/kidtimer to configure."
    }
    
    
    go_create_message_files () {
    cat << EOF > $basedir/send5.sh
    #!/bin/bash
    Name=\$1
    /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \
        /usr/share/pixmaps/gnome-set-time.png "ALERT" \
        "You will be logged out in 5 minutes."' \$Name
    EOF
    chmod +x $basedir/send5.sh
    cat << EOF > $basedir/send4.sh
    #!/bin/bash
    Name=\$1
    /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \
            /usr/share/pixmaps/gnome-set-time.png "ALERT" \
            "You will be logged out in 4 minutes."' \$Name
    EOF
    chmod +x $basedir/send4.sh
    cat << EOF > $basedir/send3.sh
    #!/bin/bash
    Name=\$1
    /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \
            /usr/share/pixmaps/gnome-set-time.png "ALERT" \
            "You will be logged out in 3 minutes."' \$Name
    EOF
    chmod +x $basedir/send3.sh
    cat << EOF > $basedir/send2.sh
    #!/bin/bash
    Name=$1
    /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \
            /usr/share/pixmaps/gnome-set-time.png "ALERT" \
            "You will be logged out in 2 minutes."' \$Name
    EOF
    chmod +x $basedir/send2.sh
    cat << EOF > $basedir/send1.sh
    #!/bin/bash
    Name=\$1
    /bin/su -s /bin/bash -c 'DISPLAY=:0 /usr/bin/notify-send -i \
            /usr/share/pixmaps/gnome-set-time.png "ALERT" \
            "You will be logged out in 1 minute."' \$Name
    EOF
    chmod +x $basedir/send1.sh
    cat << EOF > $basedir/logout.sh
    #!/bin/bash
    Name=\$1
    /usr/bin/pkill -KILL -u \$Name
    rm -rf /tmp/kidtimer.shutdown.\$Name
    EOF
    chmod +x $basedir/logout.sh
    cat << EOF > $basedir/schedule/blank
    #hour weekday weekend (y/n)
    00 n n
    01 n n
    02 n n
    03 n n
    04 n n
    05 n n
    06 n n
    07 n n
    08 y y
    09 y y
    10 y y
    11 y y
    12 y y
    13 y y
    14 y y
    15 y y
    16 y y
    17 y y
    18 y y
    19 y y
    20 n n
    21 n n
    22 n n
    23 n n
    #minutes weekday weekend
    MAX 120 240
    EOF
    }
    
    
    go_check () {
    for I in `cat $configdir/kid.list`; do
            /usr/bin/users | grep -q $I
            if [ $? -eq 0 ]; then
                    if [ -e $basedir/time/$I.ttl ]; then
                            C=`cat $basedir/time/$I.ttl`
                            C=$((C + 1))
                            echo $C > $basedir/time/$I.ttl
                    else
                            echo 1 > $basedir/time/$I.ttl
                            C=1
                    fi
            else
            go_clean_jobs $I
            exit 0
        fi
            # check total time.
            W="no"
            [ $DOW -eq 6 ] && W="yes"
            [ $DOW -eq 7 ] && W="yes"
            [ "$W" == "no" ] && TIME_LIMIT=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $2 }'`
            [ "$W" == "yes" ] && TIME_LIMIT=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $3 }'`
            if [ $C -ge $TIME_LIMIT ]; then
                    if [ ! -e /tmp/kidtimer.shutdown.$I ]; then
                            /usr/bin/passwd $I -l
                            go_logout $I
                    fi
            fi
    done
    }
    
    
    go_clean_jobs () {
    K=$1
    for I in `/usr/bin/atq | awk '{ print $1 }' | sort`; do
        /usr/bin/at -c $I | grep kidtimer | grep -q $K
        [ $? -eq 0 ] && /usr/bin/at -d $I
    done
    [ -e /tmp/kidtimer.shutdown.$K ] && rm -rf /tmp/kidtimer.shutdown.$K
    }
    
    
    go_daily () {
    for I in `cat $configdir/kid.list`; do
        ls -l $basedir/time/$I.ttl | grep -q "$Cdate"
        if [ ! $? -eq 0 ]; then
            echo "0" > $basedir/time/$I.ttl
        fi
    done
    }
    
    
    go_hourly () {
    if [ -s $configdir/kid.list ]; then
        for I in `cat $configdir/kid.list`; do
            if [ -e $basedir/schedule/$I ]; then
                [ "$WEEKEND" == "no" ] && TL=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $2 }'`
                [ "$WEEKEND" == "yes" ] && TL=`cat $basedir/schedule/$I | grep ^MAX | awk '{ print $3 }'`
                [ -e $basedir/time/$I.ttl ] && C=`cat $basedir/time/$I.ttl`
                [ $C -ge $TL ] && /usr/bin/passwd $I -l && exit 0
                [ "$WEEKEND" == "no" ] && R=`grep ^$HOUR $basedir/schedule/$I | awk '{ print $2 }'`
                [ "$WEEKEND" == "yes" ] && R=`grep ^$HOUR $basedir/schedule/$I | awk '{ print $3 }'`
                if [ "$R" == "y" ]; then
                    /usr/bin/passwd $I -u
                else
                    /usr/bin/passwd $I -l
                    /usr/bin/users | grep -q $I && /usr/local/bin/kidtimer shutdown $I
                fi
            fi
        done
    fi
    }
    
    
    go_logout () {
    K=$1
    echo "$basedir/send5.sh $K" | at now + 1 minutes
    echo "$basedir/send4.sh $K" | at now + 2 minutes
    echo "$basedir/send3.sh $K" | at now + 3 minutes
    echo "$basedir/send2.sh $K" | at now + 4 minutes
    echo "$basedir/send1.sh $K" | at now + 5 minutes
    echo "$basedir/logout.sh $K" | at now + 6 minutes
    touch /tmp/kidtimer.shutdown.$K
    }
    
    
    go_addtime () {
    U=$KID
    A=$Time
    if [ "$KID" == "reset" ]; then
        echo "0" > $basedir/time/$U.ttl
        echo "Done."
        exit 0
    Elif [ "$KID" == "" ]; then
        echo "Error."
        echo "Syntax: addtime <user> <minutes|reset>"
        exit 1
    else    
        C=`cat $basedir/time/$KID.ttl`
        C=$((C - Time))
        echo $C > $basedir/time/$KID.ttl
        echo "New total minutes is "$C"."
        echo "Done."
    fi
    
    /usr/bin/passwd $KID -u
    }
    
    
    go_tui () {
    go_command_list
    echo -n "Choose: "; read -e X
    case "$X" in
    1) go_setup_user
            ;;
    2) go_modify_user
            ;;
    3) go_remove_user
            ;;
    4) go_list_users
        ;;
    5) exit 0
            ;;
    esac
    go_tui
    }
    
    
    go_command_list () {
    echo
    echo "1) Setup user limits."
    echo "2) Modify user limits."
    echo "3) Remove user limits."
    echo "4) List configured users."
    echo "5) Quit."
    echo
    }
    
    
    go_list_users () {
    echo
    echo "Users configured for kidtimer:"
    if [ -s $configdir/kid.list ]; then
        cat $configdir/kid.list
    else
        echo "No configured users."
    fi
    }
    
    go_setup_user () {
    echo
    echo -n "Username: "; read -e U
    /usr/bin/id $U > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        /bin/cp $basedir/schedule/blank $basedir/schedule/$U
        echo "0" > $basedir/time/$U.ttl
        echo $U >> $configdir/kid.list
        echo "Done."
        echo
        echo -n "Modify limits now ?(y/n): "; read -e M
        if [ "$M" == "y" ]; then
            if [ -e /usr/bin/nano ]; then
                        /usr/bin/nano $basedir/schedule/$U
                        echo "Done."
                else
                        /usr/bin/vi $basedir/schedule/$U
                        echo "Done."
                fi
        fi
    else
        echo "Error. User does not exist. Please create user using the useradd command first."
    fi
    }
    
    
    go_modify_user () {
    echo
    echo -n "Username: "; read -e U
    grep -q ^$U $configdir/kid.list
    if [ $? -eq 0 ]; then
        if [ -e /usr/bin/nano ]; then
            /usr/bin/nano $basedir/schedule/$U
            echo "Done."
        else
            /usr/bin/vi $basedir/schedule/$U
            echo "Done."
        fi
    else
        echo "Error. User not setup. Please setup user first."
    fi
    }
    
    
    go_remove_user () {
    echo
    echo -n "Username: "; read -e U
    grep -q ^$U $configdir/kid.list
    if [ $? -eq 0 ]; then
        grep -v ^$U $configdir/kid.list > /tmp/kidtimer.tmp
        cat /tmp/kidtimer.tmp > $configdir/kid.list
        echo "Done."
    else
        echo "Error. User is not setup."
    fi
    }
    
    
    go_help () {
    echo
    echo "Commands:"
    echo "--------------------------------------------------------------------------------"
    echo "addtime <user> <minutes> ... Increases allowed time for the day."
    echo "logout <user>            ... Starts logout sequence for user."
    echo "hourly                   ... Enables/disables user access based on the schedule."
    echo "daily                    ... Resets time for the new day."
    echo "help                     ... This list."
    echo "--------------------------------------------------------------------------------"
    }
    
    ###################### Code ####################
    ################################################
    
    go_check_install
    [ $TUI -eq 1 ] && go_tui
    
    case "$COMMAND" in
    addtime) go_addtime
        ;;
    logout) go_logout $KID
        ;;
    initialize) go_initialize
        ;;
    hourly) go_hourly
        ;;
    daily) go_daily
        ;;
    check)  go_check
        ;;
    -h) go_help
        ;;
    help) go_help
        ;;
    esac
    exit 0
    
  2. 実行する:

    Sudo ./kidtimer.install
    
  3. それを実行します:

    Sudo kidtimer
    
  4. 既存のユーザーアカウントをセットアップします。

  5. できた.

ヘルプ:

Sudo kidtimer help

ユーザーのアカウントに時間を追加します(その日のみ):

Sudo kidtimer addtime user minutes

特徴:

  • 子供が平日と週末の両方で特定の時間帯にコンピュータにアクセスできるようにします。
  • 平日と週末の両方の最大時間を設定します。

キーファイル:

/etc/kidtimer/kid.list
/etc/cron.d/kidtimer
/usr/local/kidtimer/schedule/<user>
/usr/local/kidtimer/time/<user>.ttl
/usr/local/bin/kidtimer

Cronjobs:

  • ユーザーがログインしているかどうかを1分ごとに確認します。ログインしている場合は、合計時間を増やします。最大時間に達した場合は、アカウントを無効にし、ログオフシーケンスを開始します(合計5分)。
  • ユーザーがログインを許可されているかどうかを1時間ごとに確認します。その場合、アカウントを有効にします。
  • 深夜に、時刻をリセットします。

注意:

アプリケーションはnotify-sendを使用して、ユーザーの時間が不足していることを警告します。時間がなくなると、すべてのユーザープロセスが終了するため、ユーザーを準備してください。

6
grover66

timekpr-このプログラムは、ユーザーアカウントのコンピューター使用量を追跡および制御します。一定のアクセス期間に基づいて毎日の使用を制限し、ログインできる期間またはログインできない期間を設定できます。このアプリケーションを使用すると、管理者はアカウントのログイン期間またはアカウントのアクセス時間を制限できます。アプリケーションは親の時間制御として機能し、子のアクセス時間を制限したい親にとって有用です。

Even Nedberg proposed the following answer:
Just started copying into the 11.10 version for the PPA. Should finish
in a few minutes.

ppa:timekpr-maintainers/ppaをシステムのソフトウェアソースに追加することにより、この信頼できないPPAからサポートされていないパッケージでシステムを更新できます。

deb http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu oneiric main 
deb-src http://ppa.launchpad.net/timekpr-maintainers/ppa/ubuntu oneiric main 

このパッケージはで利用可能です:

問題:

バグを報告します here だから指をクロスして待ってください....

5
hhlp

前書き

次のコマンドにより、ユーザーがログインしているかどうかを確認できます。

who -u

次のような出力が得られます。

$ who -u
jacob    :0           2016-03-17 20:48   ?          2557 (:0)
newuser  :1           2016-03-17 20:50   ?          4466 (:1)

出力では、対象ユーザーのpidを取得します。時間が制限を超えた場合、停止する必要があります。

ソリューション

ユーザーがSudo特権を持っていない場合:

このソリューションは、小さなバックグラウンドスクリプトです。スクリプトの先頭に設定するために、1日あたりの使用量を定義された分数に制限します。一度セットアップすれば(それほど難しくありません)、非常に簡単に実行でき、その後の追加のアクションは不要です。

開かれている可能性のあるファイルの不要なデータ損失を防ぐために、60秒before対象ユーザーの制限時間が切れると、DISPLAYにメッセージが表示されます。

enter image description here

スクリプト

#!/usr/bin/python3
import subprocess
import os
import sys
import time


#--- set the time limit below (minutes)
minutes = 120
#--- set the user name to limit below
user = "newuser"

uselog = "/opt/limit/uselog"
datefile = "/opt/limit/currdate"

def read(f):
    try:
        return int(open(f).read().strip())
    except FileNotFoundError:
        pass

def message(disp, user):
    return "DISPLAY="+disp+" su - "+user+" -c "+'"'+\
      "notify-send 'User "+user+\
      " will be logged off in 60 seconds'"+'"'


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
    # if the pid of the targeted process exists, add a "tick" to the used quantum
    check = subprocess.check_output(["who", "-u"]).decode("utf-8")
    pid = [l.split() for l in check.splitlines() if user in l]
    if pid:
        n = read(uselog)
        n = n + 1 if n != None else 0
        open(uselog, "wt").write(str(n))
        # when time exceeds the permitted amount, kill the process
        if n > minutes*6:
            disp = [d for d in [d[1] for d in pid] if all([":" in d, not "." in d])][0]
            subprocess.Popen(["/bin/bash", "-c", message(disp, user)])
            time.sleep(60)
            pids = [p[-2] for p in pid]
            for p in pids:
                subprocess.Popen(["kill", p])  

    currday1 = currday2

使い方

  1. デスクトップ(または他の場所)で、limitという名前のフォルダーを作成します。
  2. スクリプトを空のファイルにコピーし、limit_use(拡張子なし)フォルダー内およびとして保存します
  3. スクリプトの先頭で、制限するユーザー名と、許可される最大分数を編集します。例では:

    #--- set the time limit below (minutes)
    minutes = 1
    #--- set the user name to limit below
    user = "jacob"
    
  4. フォルダーを/optディレクトリーにコピーします。

    cp -r /path/to/limit /opt
    
  5. /etc/rc.localを編集して、起動時にスクリプトがrootとして実行されるようにします。

    Sudo -i gedit /etc/rc.local
    

    行の直前

    exit 0
    

    別の行:

    /opt/limit/limit_use &
    

説明;使い方

  • 10秒に1回、スクリプトは対象ユーザーがログインしているかどうかを確認します。ログインしている場合は、合計使用量に「ポイント」を1つ追加して、ファイル(/opt/limit/uselog)に記録します。 1日の制限に達すると、スクリプトはユーザーのログインを許可しなくなり、プロセスが存在する場合は強制終了します。
  • 日が変わると(日付はファイルに記録されるため、再起動は役に立たない)、ログファイルが削除され、新しい使用時間が蓄積されます。
  • スクリプトはboot upで実行されるため、rc.localからは、ユーザーがプロセス名を知っている場合のみ、Sudo特権を持つユーザーのみがスクリプトを停止できます。

スクリプトを停止します

スクリプトを停止する場合は、次のコマンドを使用します。

Sudo kill "$(pgrep limit_use)"

ただし、そのためにはSudoパスワードが必要です。

3
Jacob Vlijm

timekprを試しましたが、機能しませんでした。次に、私のUbuntuで動作するバリアントを作成しました。これは、このバリアントに対して行う必要があるものです。

  1. ルート権限のみを持つ/var/lib/timelimit/user_to_be_limited.limitファイルに時間制限を追加します。例えば1800秒(30分)の1日制限。

  2. 次を使用して、root権限で/usr/local/bin/timelimit.shを作成します。

    #!/bin/bash
    
    pollTime=30
    export DISPLAY=:0
    
    while(true); do
        sleep $pollTime
        usersLogedIn=$( users|sed -e 's/\s\+/\n/g'|sort|uniq )
        for userName in $usersLogedIn; do
            if [[ -e "/var/lib/timelimit/$userName.limit" ]]
            then
                if [[ ! -e "/var/lib/timelimit/$userName.time" || `( stat -c '%z'  /var/lib/timelimit/$userName.time|cut -c9,10 )` != `date +%d` ]]
                then 
                    echo $pollTime > /var/lib/timelimit/$userName.time
                else
                    timeUsed=$(( `cat /var/lib/timelimit/$userName.time` + $pollTime ))
                    echo $timeUsed > /var/lib/timelimit/$userName.time
                fi
                if [[ `cat /var/lib/timelimit/$userName.time` -gt `cat /var/lib/timelimit/$userName.limit` ]]
                then
                    export XAUTHORITY=/home/$userName/.Xauthority
                    notify-send --icon=gtk-dialog-warning --urgency=critical -t 30000 "$userName" "You have 60 seconds left!"
                    sleep 60
                    pkill -u $userName
                fi
            fi
        done
    done
    
  3. /etc/rc.localに追加:

    Sudo /usr/local/bin/timelimit.sh &
    
  4. Ubuntuを再起動します

2
Csaba

答えを簡単に入手できるようにしました。コードはスレッドで説明されています http://forums.linuxmint.com/viewtopic.php?f=213&t=77687 要するに、1日あたりの分単位で設定された制限、1分ごとのcronジョブ、ユーザーに通知するメッセージ、強制的なログオフ。

これをダウンロードしてインストールするには、ターミナルを開き、以下のコマンドを実行します。

cd /tmp/
git clone https://github.com/Thomas-Baeckeroot/ParentalControl.git
cd ParentalControl/
./install.sh

インストールプロセス中に管理者パスワードが要求されます(cronジョブをインストールするため、スクリプトをコピーするためなど)。そこからあなたはすべての人のために導かれます。念のため、同じ場所に./uninstall.shもあります。すべてのUbuntuベースのディストリビューション(Mintなど...おそらくすべてdebianも)で動作するようにビルドされています。問題が発生した場合は、システムバージョンとグラフィカル環境をコメントに含めてお知らせください。

uname -a
echo $XDG_CURRENT_DESKTOP

トーマス・ベケルート

2

Linuxマシンでの再生時間を監視できる新しいアプリケーションLittleBrotherのベータ版をリリースしました。テストユーザーはDebianパッケージを試してみてください。それをダウンロードして使用する方法については、こちらをご覧ください: https://github.com/marcus67/little_brother 。ただし、インストールはまだ少し荒いかもしれません。これらは、アプリケーションの機能です。

  • 任意の数のユーザーを監視できます。
  • 各ユーザーは、許可された再生時間を定義する特定のルールセットを持つことができます。
  • ルールは、曜日や休暇スケジュールなどの「コンテキスト」に適合させることができます(現在、ドイツのスケジュールのみがサポートされています)。
  • 再生時間はタイムウィンドウ(from、to)に制限できます。
  • 1日あたりの最大再生時間を定義できます。
  • ユーザーは、特定の最大セッション時間の後に休憩を取ることを強制できます。
  • ユーザーは、アクティビティの後、最小限の休憩時間を待つことを強制できます。
  • 任意の数のLinuxクライアントホストを監視できます(現在、これにはユーザーがすべてのマシンで同じログインを持っている必要があります)。
  • すべてのユーザーのアクティビティの履歴を持つマスターホストがあります。このマスターホストはルールセットをチェックし、必要に応じてプロセスを終了するようクライアントホストに要求します。
  • マスターホストは、設定された履歴期間(7日間など)にわたってユーザーアクティビティを表示するためのシンプルなWebインターフェイスと、設定された将来の日数のルール例外を動的に定義する管理ページを提供します。
  • Webアプリケーションはプロキシの背後で実行できるため、離れたところからアクセスできるようになり、若いユーザーからの呼び出しを受け取って、より多くのプレイ時間を求めてリモート管理できるようになります。
  • アプリケーションは、国際言語をサポートしています。現在、英語とドイツ語の翻訳が提供されています。ユーザーは、他の言語の翻訳を提供するように招待されています。
  • アプリケーションは音声生成を使用して、差し迫った強制ログアウトをユーザーに通知します。また、これらの音声メッセージは国際化されています。
  • Linuxホストで費やした時間に加えて、アプリケーションはスマートフォンやテーブルなどの他のデバイスのアクティビティ時間も監視できます。最新のオペレーティングシステムのほとんどは、デバイスが使用されていない間、デバイスを何らかの省電力モードにするという事実を利用しています。このように、(pingによる)ネットワーク応答を使用して、これらのデバイスのアクティビティを判断できます。 Linuxホストとは対照的に、アプリケーションはアクティビティを終了できません。ただし、再生時間は全体の再生時間に追加されるため、許可される時間に影響を与え、Linuxホストの休憩時間ルールにも影響を与えます。

いくつかのスクリーンショット:

Status PageAdministration Page

1
Marcus Rickert