Saturday, May 4, 2024
 Popular · Latest · Hot · Upcoming
5
rated 0 times [  5] [ 0]  / answers: 1 / hits: 3870  / 3 Years ago, mon, july 19, 2021, 12:55:15

I've made a custom directory where I've put a couple of my favourite wallpapers. I made a script which examines this directory, counts the number of PNGs, and then randomly sets one image as a wallpaper. It looks like this:



#!/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


Now, how can I make this script runs on each login (this is very easy thou) or once a day if not has been already run on login?



The problem is that I often suspend my Ubuntu and then awake it tomorrow morning, so in this case I never log in again. Setting this script as startup job would not help me as, obviously, when awaken from suspend, I never re-log in. I cannot simply set it via cron job as well because in cases when I do log in, the wallpaper would be changed two times a day.



PS. anyone feel free to use this script with cron (just set your own path and filename template or wait for a solution like mine :)


More From » bash

 Answers
4

Set this as a startup application:



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

check_stamp()
{
stamp="$1"
interval="$2"

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="$1"
touch $stamp
}


STAMP=$1
INTERVAL=$2
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


Replace the /path/to/your/script (inside the while loop) with the path to your script.

Call this script passing first a path to a file that will serve as a stamp followed by an interval in days, for example scriptname /home/user/stampfile 1. It will run endlessly and check the current time against the stamp every 10 minutes (sleep 600). If the difference is greater than the interval it runs your script and updates the stamp.


[#36865] Tuesday, July 20, 2021, 3 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
fittecanap

Total Points: 322
Total Questions: 100
Total Answers: 105

Location: Israel
Member since Tue, Nov 17, 2020
4 Years ago
;