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 running
Im 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 2020
Nothing 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 ~/test
HTH
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 ~/test
but this below would not work as a line not broken.
echo 'DISPLAY=:0 $HOME/bin/fehrand' > ~/test at now + 1 minute -f ~/test
home 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 ~/test
echo 'DISPLAY=:0 feh --bg-scale /usr/share/backgrounds/gnome/adwaita-day.jpg' > ~/test
at now + 1 minute -f ~/test
echo 'DISPLAY=:0 feh --bg-scale /usr/share/backgrounds/gnome/adwaita-night.jpg' > ~/test
at now + 1 minute -f ~/test
Offline
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 ~/test
Or 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 ~/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 ~/test
Or 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 testfile
This 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 && night
Last 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
done
No 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
fi
Last 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
fi
I 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;
done
Last 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