Conveniently schedule a command to run later?
Solution 1
You can use the at
command. The at
execute commands at a later time. The at
utility shall read commands from standard input and group them together as an at-job, to be executed at a later time.
Usually, at
is installed by default in Ubuntu, but if your release doesn't include it, install via:
sudo apt-get install at
For more information, options, examples, and others, see the manpage in man 1 at
.
Example of a relative time specification (note the space between +
and the duration):
at now + 8 hours -f ~/myscript.sh
You can also use convenient shorthands, like tomorrow
or noon
, as in
echo "tweet fore" | at teatime
Note: This will run the command to the left of the pipe immediately - and its output (which is piped to at
) will be run by at
at the scheduled time. So, the above command schedules tweet fore
to be run at teatime.
The example also demonstrates how you can pipe actions into at
. at -c
is the way you can examine scheduled actions, which you can conveniently list with their number, as with:
at -c 3
Solution 2
Yes, you can set a cron job.
For example if now the time is 14:39:00 and today is friday, 30 august, you can add the following cron job (to be executed after 8 hours) in your crontab file using crontab -e
command:
39 22 30 8 5 /path/to/mycommand.sh
More about:
Solution 3
Use the Gnome-based GUI for cron
, at
, and the like:
The introduction of the CronHowto suggests using the gnome-schedule
gui, which is much nicer than typing all the garbage into the terminal (esp. for "average" Ubuntu users who are not "power" *nix/bsd users.)
Run it by using the Unity Dash (or other applications menu) to look for Scheduled Tasks or running gnome-schedule
.
On Gnome-based Ubuntu systems Gnome Scheduled tasks tool (from the gnome-schedule package) in Applications --> System Tools provides a graphical interface with prompting for using Cron. The project website is at http://gnome-schedule.sourceforge.net/; the software is installable from the Software Center or by typing
sudo apt-get install gnome-schedule
in a terminal.
Using gnome-schedule
, for a script in your home directory, a new "at" command would be set up using this type of window:
Solution 4
Check the output of date
in a loop. This is a quick and dirty way to do this, like if you can't use at
, cron
, or other tools.
Say you want your script to run at noon:
until [[ $(date +%H:%M) == 12:00 ]]; do
sleep 30
done
./mycommand.sh
Say you want it to run tomorrow at noon (today is Nov 24 for me):
until [[ $(date +%d_%H:%M) == "25_12:00" ]]; do
sleep 30
done
./mycommand.sh
Previously, this answer recommended regex, which has some pitfalls, like a lot of special characters. As well it recommended matching against the whole date string, which is more error-prone since it's locale-dependent. For example, I use some French locale formats since I live in Quebec, so if I forget about that and write until [[ $(date) == "25 12:00" ]]
, it will never match because the French ordering is "day month year, time" instead of the English "month day time year".
Solution 5
If you are running bash on a mac you will run into some difficulties using the at
program. In that case you can improve on your original proposed solution of,
nohup bash -c "sleep 28800 ; ./mycommand.sh" &
with this,
nohup bash -c "sleep $(echo '8 * 60 * 60' | bc) ; ./mycommand.sh" &
which is a more readable form of how long you want to wait. In this example 8
is the number of hours you want to wait before running your script mycommand.sh
.
Related videos on Youtube
![Saptronic](https://i.stack.imgur.com/lr2pH.jpg?s=256&g=1)
Saptronic
Updated on September 18, 2022Comments
-
Saptronic almost 2 years
What's a simple way to run a command, say, 8 hours from now? I can think of this way:
nohup bash -c "sleep 28800 ; ./mycommand.sh" &
Is there a more "proper" way?
-
Admin over 8 yearsIs there something wrong with
nohup
+sleep
? Why is it "improper"?
-
-
Saptronic almost 11 yearsOk, yes, I should have mentioned I know about Cron jobs. This is even messier because then it sits around in the crontab indefinitely, right?
-
Radu Rădeanu almost 11 years@SteveBennett As in my example, no: 5 means friday, 8 means august, 30, means today.
-
ShadowRunner almost 11 years@RaduRădeanu: with cron, careful that it could fire again in a few years (when there is another 30th of August occuring on a friday) ...
-
Radu Rădeanu almost 11 years@OlivierDulac The current version of Ubuntu will be probably EOF at that time (30 august 2019) :)
-
emory almost 11 yearsThis is a clever hack. However 'at' is a much better way. What would happen if the computer was turned off at 14:39?
-
Simon Richter almost 11 yearsIn addition, there is
at 8:00
to run the command at an absolute time, andbatch
for "when it looks like the computer is idle" -
Saptronic almost 11 years@RaduRădeanu yes, but the crontab itself doesn't get cleared does it? It's just messy.
-
Paddy Landau almost 11 years@SteveBennett I agree.
cron
is an overkill for a one-off run. -
Saptronic almost 11 yearsErr that's still not my point. My point is that the text you entered will (I think) literally still be sitting in your crontab after the event, creating another cleanup task for you.
-
Paddy Landau almost 11 years@SteveBennett Yes, you are correct. The command will remain in your
crontab
until you remove it. A year later, when you have forgotten who put it there and why, you will be left scratching your head wondering what to do with the command. -
Dan almost 11 yearsIn case anyone was wondering,
teatime
is at 4pm. For some reasons it's not mentioned in manpages.ubuntu.com/manpages/raring/man1/at.1posix.html but it is inman at
and here manpages.ubuntu.com/manpages/raring/en/man1/at.1.html. -
Saptronic almost 11 yearsWow,
batch
looks like a really useful command (although its mode of operation is weird - no arguments.) -
heartsmagic over 10 yearsMaybe we can mention that "at" utility is not installed by default and if anyone else want to get it simply install the "at" package? Edit: Anyway, i simply edited the answer (also fixed the manpage link).
-
Saptronic almost 10 yearsOne nuisance I've discovered with
at
is its lowest resolution is 1 minute. You can schedulenow
or+1 minute
but nothing between. Can be a bit annoying for trying to just fork a job. -
Asifa.K over 9 yearsCan I set the email address to which emails get sent?
-
Mitch over 9 yearsYes you can. Take a look at this.
-
Andrew Hill over 8 yearsat is capable of describing time in a bunch of different ways ' x| at 4am tomorrow' can be useful.
-
AlikElzin-kilaka about 8 yearsHow to control the pending commands? See the list? Cancel a command? The documentation is so lacking :(
-
AlikElzin-kilaka about 8 years
-
dimo414 over 7 yearsTo the two people who've upvoted this answer, please use
at
,cron
, or any other real scheduler application. Task scheduling is hard, and not a wheel you should reinvent. -
wjandrea over 7 years@dimo414 What's wrong with my method?
-
dimo414 over 7 yearsAt a minimum, it's busy-waiting, which is wasteful. Worse, it's not guaranteed to be correct; it's perfectly possible (if unlikely) for the conditional to be missed. Basing your scheduler on regular expressions is also highly error-prone. It might work well-enough, but has no advantages over
at
. -
manatwork over 7 yearsAnother reason to use
at
is because its jobs will survive a reboot. -
user215175 over 6 yearsEntering a comment into crontab explaining the purpose of the command would reduce the amount of head scratching. I put a blank line at the end of my crontab, then add "#Description of my command" followed by the crontab entry for the command. I do think the correct answer to the original poster is to use "at" instead of a crontab entry.
-
rmanna over 6 yearsabout the whole piping-into-at running now instead of later issue,
echo "/command/to/run" | at teatime
produces the desired outcome -
Thyag over 5 yearsIn most commercial environments, setting up cron jobs require admin privileges. Most programmers would skip this step (interacting with people). They would rather write their own custom schedulers,
-
Eli over 5 yearsMy server doesn't have
at
installed and I'm a user without sudo. I think this alternative is better. @dimo414 -
dimo414 over 5 years@Eli your server certainly does have
cron
or another task scheduling tool. -
Aydin Gerek over 3 yearsThis'll do the trick. I have no sudo and can't access cron or at either. I'm not staying up any later to schedule an experiment that I want run by tomorrow. I'll bet there are better ways to do this, but they're all eating into my sleep schedule at this point.
-
deanresin over 3 years
at
is very limited because it runs the command only insh
so none of your bash aliases or bash functions will work. -
koushik naskar about 3 yearshow can i specify the command directly instead of the file?
-
Prof.Chaos almost 3 yearsgnome-schedule doesn't seem to exist for Ubuntu 21.04