You are not logged in.
Pages: 1
Im trying to figure out the at command without much luck.
at executes commands at a specified time.
https://packages.debian.org/bullseye/at
i have the atd daemon running in service
 ~ $ > service atd status
atd is runningIm not sure what im to expect but im pretty sure a terminal window should appear in 1 minute from executing the at command using these commands?
~ $ > at now + 1 minute -f /usr/local/bin/st
warning: commands will be executed using /bin/sh
job 21 at Sat Dec 12 23:37:00 2020Nothing happens ??
Im want to integrate at into a script somehow but if it doesnt work on the commandline then its useless or im useless and dont know what im doing.
This is a chimaera/testing installation.
Last edited by dice (2020-12-12 13:46:00)
Offline

It's not you, and it's not just chimaera. I tried it in beowulf, and I can't get it to work. When I tried 'at' around 10 years ago, it was simple to figure out and it worked as expected. I'm not sure what changed.
The man page states that HH:MM is the correct format for time, but apparently 09:21 or similar is not the correct time format. So I no longer know how to do HH:MM. I tried it around two dozen different ways. (Can you tell that I'm angry?)
Sorry I have nothing useful to offer. Oh wait, yes I do. Screw at, make a cron job. Last time I did that it worked as expected.
Offline
yeah made me a bit angry as well. I will have to try and incorporate cron into what im thinking of. I wanted to emulate gnome backgrounds adwaita morning noon night wallpapers somehow with feh.
Last edited by dice (2020-12-12 14:59:07)
Offline

~ $ > at now + 1 minute -f /usr/local/bin/st
The -f switch causes the command to be read from a file, which you have specified as /usr/local/bin/st.
Try this instead:
echo 'DISPLAY=:0 /usr/local/bin/st' > ~/test
at now + 1 minute -f ~/test^ That works for me. Note that any environmental variables are not passed to the command so they must be specified explicitly.
The man page states that HH:MM is the correct format for time, but apparently 09:21 or similar is not the correct time format. So I no longer know how to do HH:MM.
Actually the man page says:
-t time
run the job at time, given in the format [[CC]YY]MMDDhhmm[.ss]
So try
at -t 12121600 -f ~/testHTH
EDIT: that example runs the command on 2020-12-12 at 16:00.
Last edited by Head_on_a_Stick (2020-12-12 15:43:25)
Brianna Ghey — Rest In Power
Offline
Thanks head on a stick.
I cant understand how the command is laid out though. very strange if you ask me.
This below worked for a feh command.
echo 'DISPLAY=:0 $HOME/bin/fehrand' > ~/test
at now + 1 minute -f ~/testbut this below would not work as a line not broken.
echo 'DISPLAY=:0 $HOME/bin/fehrand' > ~/test at now + 1 minute -f ~/testhome env variable added to the code quotes.
contents of fehrand
#!/bin/bash
feh --randomize --bg-scale /usr/share/backgrounds/*Last edited by dice (2020-12-12 16:11:36)
Offline
Think i have it, thanks head on a stick. Need to adjust times and add into a startup script, but this is what im after...
echo 'DISPLAY=:0 feh --bg-scale /usr/share/backgrounds/gnome/adwaita-morning.jpg' > ~/test
at now + 1 minute -f ~/testecho 'DISPLAY=:0 feh --bg-scale /usr/share/backgrounds/gnome/adwaita-day.jpg' > ~/test
at now + 1 minute -f ~/testecho 'DISPLAY=:0 feh --bg-scale /usr/share/backgrounds/gnome/adwaita-night.jpg' > ~/test
at now + 1 minute -f ~/testOffline

but this below would not work as a line not broken.
echo 'DISPLAY=:0 $HOME/bin/fehrand' > ~/test at now + 1 minute -f ~/test
I don't think $HOME will be understood unless you specify it (replace $user with the actual username):
echo 'DISPLAY=:0 HOME=/home/$user $HOME/bin/fehrand' > ~/test
at now + 1 minute -f ~/testOr just call the full path to the script, which would be simpler.
Brianna Ghey — Rest In Power
Offline
dice wrote:but this below would not work as a line not broken.
echo 'DISPLAY=:0 $HOME/bin/fehrand' > ~/test at now + 1 minute -f ~/testI don't think $HOME will be understood unless you specify it (replace $user with the actual username):
echo 'DISPLAY=:0 HOME=/home/$user $HOME/bin/fehrand' > ~/test at now + 1 minute -f ~/testOr just call the full path to the script, which would be simpler.
im just not using full paths publicly on the forum.
Offline

HoaS: I was referring to this part of the man page:
At allows fairly complex time specifications, extending the POSIX.2 standard. It accepts times
of the form HH:MM to run a job at a specific time of day.
Your example worked. I was not putting the command inside a file. Isn't there a way to run the command from the command line?
This works:
at now + 1 minute -f testfileThis does not work:
at now + 1 minute echo "hello"Offline

I was referring to this part of the man page
Yes, it does seem to be somewhat contradictory, not sure why 
Isn't there a way to run the command from the command line?
If you run it without -f then it accepts input from STDIN:
$ at now + 1 minute        
warning: commands will be executed using /bin/sh
at> DISPLAY=:0 /usr/bin/x-terminal-emulator
at> <EOT>
job 11 at Sat Dec 12 19:52:00 2020
$(<ctrl>+d exits the prompt.)
EDIT: or with a here string:
$ at now + 1 minute <<<'DISPLAY=:0 /usr/bin/x-terminal-emulator'
warning: commands will be executed using /bin/sh
job 13 at Sat Dec 12 19:58:00 2020
~$A here document also works.
Last edited by Head_on_a_Stick (2020-12-12 19:59:34)
Brianna Ghey — Rest In Power
Offline
Thanks for your help head on a stick, what do you think of below script? It works for me, sets the background in 1 minute increments x 3 using command functions in parallel. Im thinking if i put this in my autostart file (.xinitrc) with the correct time/date (today) it should suffice to emulate how the gnome backgrounds function for these wallpapers. The only issue i see is that the wallpapers wont load up if the "at" command is used in the past, it will fail and ill have a blank background. Ill have to figure out the time specifications better maybe.
#!/usr/bin/env bash
morning () {
        at now + 1 minute <<< 'DISPLAY=:0 feh --bg-scale /usr/share/backgrounds/gnome/adwaita-morning.jpg'
}
day () {
        at now + 2 minute <<< 'DISPLAY=:0 feh --bg-scale /usr/share/backgrounds/gnome/adwaita-day.jpg'
}
night () {
        at now + 3 minute <<< 'DISPLAY=:0 feh --bg-scale /usr/share/backgrounds/gnome/adwaita-night.jpg'
}
morning && day && nightLast edited by dice (2020-12-13 13:02:02)
Offline

what do you think of below script?
I don't think that will work because all three jobs will be run at the same time.
You could use a case statement to set the wallpaper according to the time and check every 10 minutes with a while loop:
#!/bin/sh
while true
do
   case $(date +%H) in
      [0-9]|1[0-1]) time=morning;;
      1[2-8]) time=day;;
      19|2[0-3]) time=night;;
   esac
   feh --bg-scale /usr/share/backgrounds/gnome/adwaita-$time.jpg
   sleep 600
doneNo need for at at all 
And to keep this post on topic I would recommend checking the POSIX specification for more details on the command:
https://pubs.opengroup.org/onlinepubs/9 … es/at.html
The "APPLICATION USAGE" section at the end is particularly useful.
EDIT: moved sleep inside the while loop so that the wallpaper is set immediately.
Last edited by Head_on_a_Stick (2020-12-15 16:31:41)
Brianna Ghey — Rest In Power
Offline
Thats a good one head on a stick, no need for "at" at all indeed.
I tried to make something that wasnt in a while loop and have come up with the below, i would like to add in a 3rd command so it is 3 times of day (morn, day, night) but cant figure that out.
#!/usr/bin/env bash
DATE=$(date +%p)
DATE2=$(date +%p)
MORNING="AM"
NIGHT="PM"
if [[ "$DATE" == "$MORNING" ]] ; then
	feh --bg-scale /usr/share/backgrounds/gnome/adwaita-morning.jpg
elif [[ "$DATE2" == "$NIGHT" ]] ; then
        feh --bg-scale /usr/share/backgrounds/gnome/adwaita-night.jpg
fiLast edited by dice (2020-12-15 12:50:41)
Offline
Think i have figured it out without a while loop. This script should just set the background between the hours specified.
EDIT: oops no it wont. I could try and daemonize it but that would be similar to a while loop script i think?
#!/usr/bin/env bash
H=$(date +%H)
if (( 7 <= 10#$H && 10#$H < 13 )); then 
	feh --bg-scale /usr/share/backgrounds/gnome/adwaita-morning.jpg
    echo between 8AM and 1PM
elif (( 13 <= 10#$H && 10#$H < 19 )); then 
	feh --bg-scale /usr/share/backgrounds/gnome/adwaita-day.jpg
    echo between 1PM and 7PM
else
	feh --bg-scale /usr/share/backgrounds/gnome/adwaita-night.jpg
    echo night
fiI give in, looks like a while loop is the way to go, below is a variant. Hoping this works...
#!/usr/bin/env bash
get_wall () {
H=$(date +%H)
if (( 7 <= 10#$H && 10#$H < 13 )); then 
	feh --bg-scale /usr/share/backgrounds/gnome/adwaita-morning.jpg
    echo between 8AM and 1PM
elif (( 13 <= 10#$H && 10#$H < 19 )); then 
	feh --bg-scale /usr/share/backgrounds/gnome/adwaita-day.jpg
    echo between 1PM and 7PM
else
	feh --bg-scale /usr/share/backgrounds/gnome/adwaita-night.jpg
    echo night
fi
}
while true; do
  get_wall;
  sleep 600;
doneLast edited by dice (2020-12-15 16:36:31)
Offline

I could try and daemonize it but that would be similar to a while loop script i think?
Not sure what you mean by "daemonize it" but as written the script only runs through once so it can't change the wallpaper unless it is run again at some point.
Why don't you like the while loop? It only runs three very simple shell commands & feh every ten minutes so it's not exactly resource heavy.
Brianna Ghey — Rest In Power
Offline
dice wrote:I could try and daemonize it but that would be similar to a while loop script i think?
Not sure what you mean by "daemonize it" but as written the script only runs through once so it can't change the wallpaper unless it is run again at some point.
Why don't you like the while loop? It only runs three very simple shell commands & feh every ten minutes so it's not exactly resource heavy.
I was just trying to think outside the box, explore other ways if there are any.
By daemonize i mean create an init script. Start stop daemon if possible ?
Offline

I don't think an init script would be appropriate for a per-user script running something in an X session. It is possible to run services just for one user and with the various permissions required for X with systemd but I don't know how to do that with other service managers.
Brianna Ghey — Rest In Power
Offline
I don't think an init script would be appropriate for a per-user script running something in an X session. It is possible to run services just for one user and with the various permissions required for X with systemd but I don't know how to do that with other service managers.
It is possible, i just need to figure it out.
Offline
Pages: 1