Definir limites de tempo para aplicativos específicos (como jogos)

8

Eu gostaria de definir prazos para alguns aplicativos específicos (como jogos) no Ubuntu. Existem vários aplicativos do Windows que podem fazer isso, incluindo o HomeGuard Program Blocker, que pode limitar o uso de certos aplicativos a horários específicos do dia ou restringir o uso de aplicativos a determinados períodos de tempo. Existe algum software semelhante para o Ubuntu?

Anderson Green
fonte
Existe um programa chamado Parental Control para Ubuntu, mas não sei se isso permite bloquear todos os aplicativos.
Anderson Green
Até agora, esta é a única discussão relevante que encontrei nos fóruns do Ubuntu: ubuntuforums.org/showthread.php?t=977836 Alguém mencionou aplicativos chamados "Cyborg" e "Cybercafé", e ainda estou tentando encontrar eles.
Anderson Green
Há também um programa chamado timekpr, mas não sei se ele pode bloquear o acesso a aplicativos específicos.
Anderson Green
Se eu estiver desenvolvendo um aplicativo que faça isso, precisarei encontrar uma maneira de detectar processos em execução: cyberciti.biz/faq/show-all-running-processes-in-linux
Anderson Green
Também é possível restringir o acesso a aplicativos por meio da linha de comando - essas informações também podem ser úteis para os desenvolvedores. askubuntu.com/questions/8149/...
Anderson Verde

Respostas:

6

Acabei de criar o seguinte script para esse fim. Eu o nomeei timelimit:

#!/bin/bash

#timelimit - Set daily time limits for specific applications

#Licensed under the standard MIT license:
#Copyright 2013 Radu Rădeanu (https://askubuntu.com/users/147044/).
#Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
#The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE

if [ $# -ne 1 ];then
    echo "Usage: `basename $0` APP_NAME"
    exit 1
fi

export DISPLAY=:0

app_name=$@
time_to_play_daily="2:30:00"  # channge as you wish; the format is: H[:M[:S]]
file="$HOME/.count_time_$app_name"

if [ -a $file ]; then
    if [ "$(head -1 $file)" != "$(date +%D)" ]; then
        echo $(date +%D) > $file
        echo $time_to_play_daily >> $file
    fi
else 
    touch $file
    echo $(date +%D) >> $file
    echo $time_to_play_daily >> $file
fi

time_to_play_left=$(sed -n '2p' $file)

sec_left=$(echo $time_to_play_left | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')

function countdown
{
    sec_left=$(echo $time_to_play_left | awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }')
    local start=$(date +%s)
    local end=$((start + sec_left))
    local cur=$start

    while [[ $cur -lt $end ]]; do
        pid=$(pgrep -x $app_name)
        if [ "$pid" != "" ]; then
            cur=$(date +%s)
            sec_left=$((end-cur))
            time_to_play_left="$((sec_left/3600)):$(((sec_left/60)%60)):$((sec_left%60))"
            sed -i "2s/.*/$time_to_play_left/" $file
            # next line is useful only when you test from terminal
            printf "\rTime left to play with %s: %02d:%02d:%02d" $app_name $((sec_left/3600)) $(((sec_left/60)%60)) $((sec_left%60))
            sleep 1
        else
            break
        fi
    done
}

while : ; do
    pid=$(pgrep -x $app_name)
    sleep 1
    if [ "$pid" != "" ]; then
        if [ $sec_left -gt 0 ]; then
            notify-send -i $app_name "Time left to play with $app_name for today: $time_to_play_left"
        else
            notify-send -i "error" "Your time to play with $app_name has finished for today!"
        fi
        countdown $time_to_play_left
        pid=$(pgrep -x $app_name)
        if [ "$pid" != "" ]; then kill $pid; fi
    fi
done

Não se esqueça de torná-lo executável:

chmod +x timelimit

Sintaxe:

limite de tempo para APP_NAME

Importante:

  • Você pode testar esse script no terminal, mas deve ser executado na inicialização do sistema. Para que seja executado na inicialização, consulte Como executar scripts na inicialização?
  • Este script deve ser reiniciado à meia-noite se você não desligar o computador à noite. Para fazer isso, você pode adicionar um trabalho cron como:

    00 00 * * * kill `pgrep -x timelimit` e& timelimit APP_NAME
    

    Mais sobre: https://help.ubuntu.com/community/CronHowto

Radu Rădeanu
fonte
Wauw! Agradável! A reinicialização do computador ignoraria o limite de tempo? Nesse caso, seria possível tornar o limite de tempo persistente (em um arquivo somente leitura, por exemplo)?
don.joey
@ Privado Você pode testá-lo. O limite de tempo é armazenado em um arquivo; portanto, sim, o computador ignora o limite de tempo na reinicialização.
Radu Rădeanu
Eu acho que isso pode ser empacotado e se tornar parte dos repositórios. Habilidades bash bonitas! Obrigado e tenho o prazer de lhe oferecer esta recompensa.
don.joey
É bom que dá uma caixa pequena mensagem ubuntu dizer que o tempo para brincar com um jogo acaba por um dia, mas a mensagem continua sendo exibida ... por horas :)
don.joey
@ Privado Com qual aplicativo você testou? Esse aplicativo provavelmente deseja abrir novamente e novamente.
Radu Rădeanu 02/09
0

Restringir para cada lançamento
Simples e facilmente hackável. Mas use-o para se controlar
timeout 15 totem , sairá do programa após 15 segundos. Mas pode ser lançado novamente. Edite e adicione timeout <sec>ao exec campo do arquivo '.desktop' dos aplicativos

timm
fonte