Como executar um script em cada login ou uma vez por dia, se não for executado naquele dia?

5

Criei um diretório personalizado onde coloquei alguns dos meus papéis de parede favoritos. Fiz um script que examina esse diretório, conta o número de PNGs e, em seguida, define aleatoriamente uma imagem como papel de parede. Parece assim:

#!/bin/bash
#number of images in wallpaper folder
cd $HOME/Favourite\ wallpapers/
numImages='ls *.png | wc -l'

#randomly chose one number
randomNum=$[ ( $RANDOM % $numImages ) + 1 ]

#command to set wallpaper
gsettings set org.gnome.desktop.background picture-uri file://$HOME/Favourite\ wallpapers/00$randomNum.png

Agora, como posso fazer esse script ser executado em cada login (isso é muito fácil) ou uma vez por dia, se ele já não tiver sido executado no login ?

O problema é que muitas vezes eu suspendo meu Ubuntu e depois o acordo amanhã de manhã, então neste caso eu nunca mais entrei. Definir esse script como trabalho de inicialização não me ajudaria como, obviamente, ao acordar da suspensão, eu nunca faço logon novamente. Eu não posso simplesmente configurá-lo via cron job também, porque nos casos em que eu fizer login, o papel de parede ser mudado duas vezes ao dia.

PS. qualquer um se sente à vontade para usar este script com cron (apenas defina seu próprio caminho e modelo de nome de arquivo ou espere por uma solução como a minha:)

    
por ubuntico 14.07.2012 / 17:54

2 respostas

4

Defina isso como um aplicativo de inicialização:

#!/bin/bash
# Based on /etc/cron.daily/apt

check_stamp()
{
    stamp=""
    interval=""

    if [ $interval -eq 0 ]; then
    echo "check_stamp: interval=0"
    # treat as no time has passed
        return 1
    fi

    if [ ! -f $stamp ]; then
    echo "check_stamp: missing time stamp file: $stamp."
    # treat as enough time has passed
        return 0
    fi

    # compare midnight today to midnight the day the stamp was updated
    stamp_file="$stamp"
    stamp=$(date --date=$(date -r $stamp_file --iso-8601) +%s 2>/dev/null)
    if [ "$?" != "0" ]; then
        # Due to some timezones returning 'invalid date' for midnight on
        # certain dates (eg America/Sao_Paulo), if date returns with error
        # remove the stamp file and return 0. See coreutils bug:
        # http://lists.gnu.org/archive/html/bug-coreutils/2007-09/msg00176.html
        rm -f "$stamp_file"
        return 0
    fi

    now=$(date --date=$(date --iso-8601) +%s 2>/dev/null)
    if [ "$?" != "0" ]; then
        # As above, due to some timezones returning 'invalid date' for midnight
        # on certain dates (eg America/Sao_Paulo), if date returns with error
        # return 0.
        return 0
    fi

    delta=$(($now-$stamp))

    # intervall is in days, convert to sec.
    interval=$(($interval*60*60*24))
    echo "check_stamp: interval=$interval, now=$now, stamp=$stamp, delta=$delta (sec)"

    # remove timestamps a day (or more) in the future and force re-check
    if [ $stamp -gt $(($now+86400)) ]; then
         echo "WARNING: file $stamp_file has a timestamp in the future: $stamp"
         rm -f "$stamp_file"
         return 0
    fi

    if [ $delta -ge $interval ]; then
        return 0
    fi

    return 1
}

update_stamp()
{
    stamp=""
    touch $stamp
}


STAMP=
INTERVAL=
export DISPLAY=:0.0

while true; do
    if check_stamp $STAMP $INTERVAL; then
        # Do whatever you want
        /path/to/your/script

        # Update stamp
        update_stamp $STAMP
    fi

    # Sleep 10 min
    sleep 600
done

Substitua o /path/to/your/script (dentro do loop while) pelo caminho do seu script.
Chame esse script passando primeiro um caminho para um arquivo que servirá como um carimbo seguido por um intervalo em dias, por exemplo scriptname /home/user/stampfile 1 . Ele funcionará sem parar e verificará a hora atual contra o carimbo a cada 10 minutos ( sleep 600 ). Se a diferença for maior que o intervalo, ele executa o script e atualiza o carimbo.

    
por Eric Carvalho 14.07.2012 / 19:18
1

Eu criei um script chamado runonce que executa o comando fornecido apenas uma vez por 8 horas ( configurável). Coloquei o script no meu ~/bin . Então eu simplesmente uso este script dentro do meu ~/.bashrc :

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

# Upgrade my dotfiles but not always
runonce ~/.../... supi

# Print quote but not always
runonce myquote -s
    
por jreisinger 11.07.2017 / 13:07

Tags