Permitir que o processo seja executado entre as horas xey

3

Eu uso um serviço de conexão de dados móveis. Eu só tenho largura de banda irrestrita entre 9h e 16h.

Gostaria de saber como posso "silenciar" aplicativos como o miniaplicativo do Dropbox fora dessa programação.

Pensei em substituir o binário do Dropbox por este script:

#!/bin/bash
H='date +"%H"'
if (($H >= 9 && $H < 16))
then
    echo "run dropbox here"
fi

Eu queria saber se alguém teve uma ideia melhor. Ou seja, na minha solução, o Dropbox continuará funcionando após as 16h e não iniciará se o computador estiver ligado antes das 9h. Também seria legal se nenhuma restrição fosse aplicada quando em wifi.

Eu queria saber se alguém tem alguma solução para systemd ou cron ou algo assim. Eu sei que essas ferramentas são incrivelmente poderosas, mas não sabem nada além disso.

(Meu sistema: XUbuntu 15.04, ou seja, xfce4 e systemd)

    
por Ricardo Cruz 26.05.2015 / 17:06

4 respostas

2

Use cron para iniciar o daemon e eliminá-lo. Como o dropbox é executado como usuário, edite seu cronjob como seu usuário: crontab -e e, no editor, coloque:

0 9 * * * $HOME/bin/dropbox-daemon-path
59 16 * * * pkill -u "$LOGNAME" dropbox-daemon-process-name

Às 9h, ele inicia o daemon dropbox (você deve fornecer o caminho completo aqui) e, em 1 minuto até as 17h, ele o mata (para esse usuário).

Adoraria ouvir alguém com uma resposta systemd .

EDIT: Como Gilles aponta, isso não será de ajuda se o sistema estiver ligado entre 9 e 17. Novamente, essa abordagem de cronjob é sub-ótima, mas eu não sei como usar o dropbox com systemd . Tendo dito isso, tentamos sua abordagem original em um script de wrapper que sai se a hora estiver fora de seus limites:

#!/bin/bash
hour=$(date +%H)
[ $hour -lt 09 -o $hour -gt 16 ] && exit
#else
exec path-to-dropbox-daemon

Modifique o crontab ligeiramente

* 9-16 * * * $HOME/bin/dropbox-wrapper-script
59 16 * * * sleep 50; pkill -u "$LOGNAME" dropbox-daemon-process-name

Para mim, isso não é bonito. Cada minuto seu script é executado pelo cron, deixando algumas linhas de logs para trás. Mas deve ser eficaz.

    
por 26.05.2015 / 17:16
1

Configure um trabalho cron para ser executado em determinadas horas; como @Janis mencionou, isso pode ter a forma de entradas como:

0       9 * * * bin chmod +x /usr/bin/dropbox
0-59/10 * * * * root  /usr/local/bin/maybe-stop dropbox

Correndo a cada 10 minutos como eu escrevi inicialmente é um exagero, já que apenas um superusuário poderia ter mudado isso para +x , então uma idéia melhor é talvez:

0 9  * * * bin chmod +x /usr/bin/dropbox
0 16 * * * root  /usr/local/bin/maybe-stop dropbox

Onde /usr/local/bin/maybe-stop é:

#!/bin/bash
RESTRICT_PROGRAM=$1
WIFI_DEVICE=wlo1

BEGIN_FREE=9
END_FREE=16

if [ $(date +%H) -ge $BEGIN_FREE -a $(date +%H) -lt $END_FREE ]
then
    # We have free broadband: allow it.
    chmod +x /usr/bin/$RESTRICT_PROGRAM
elif ip addr show dev $WIFI_DEVICE | grep '   inet' | grep -q global
then
    # We have WiFi: allow it.
    chmod +x /usr/bin/$RESTRICT_PROGRAM
elif
else
    chmod -x /usr/bin/$RESTRICT_PROGRAM
    if [ $(date +%H) -lt $BEGIN_FREE -o $(date +%H) -ge $END_FREE ]
    then
        PIDS=$(fuser /usr/bin/$RESTRICT_PROGRAM 2>/dev/null | cut -d: -f2)
        kill -SIGTERM $PIDS
        sleep 3
        kill -SIGKILL $PIDS
    fi
fi

A segunda parte seria vincular o mesmo script a ser executado quando a configuração da rede for alterada:

/etc/NetworkManager/dispatcher.d/dropbox-check

#!/bin/sh
exec /usr/local/bin/maybe-stop dropbox
    
por 27.05.2015 / 20:58
0

Uma opção usando cron poderia ser configurar um cronjob às 9:00 e uma às 16:00 que cria (ou exclui) um flag-file em um determinado local. E o wrapper verificaria a existência desse flag-file para determinar se ele iniciaria o aplicativo ou não.

Se o seu aplicativo começou antes das 16:00 e ainda funciona depois das 16:00, você pode, obviamente - assumindo que não sabe com antecedência quanto tempo dura a execução - matar o aplicativo (por exemplo, iniciado por um cronjob).

    
por 26.05.2015 / 17:12
0
timeStart='date --date='8AM' +"%s"'
timeStop='date --date='23:59:00' +"%s"'
now='date +"%s"'

if (($now >= $timeStart && $now < $timeStop))
then
        #CRON JOBS BETWEEN 8AM AND 12PM
        echo "NO BEER"
else
        #CRON JOBS OUTSIDE OF 8AM AND 12PM
        echo "DRINK BEER"
fi
    
por 02.10.2015 / 09:42