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?
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.
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 Ubuntu Manpage Repository
at now +8 hours -f ~/myscript.sh
You can also use convenient shorthands, like
noon, as in
echo "tweet fore" | at teatime
Warning: This will run the command to the left of the pipe immediately but only present its output later.
The example also demonstrates how you can pipe actions into
at -c is the way you can examine scheduled actions, which you can conveniently list with their number, as with:
at -c 3
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
Use the Gnome-based GUI for
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
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.
gnome-schedule, for a script in your home directory, a new "at" command would be set up using this type of window:
I figured out a quick and dirty way to do this before I found out
at was a thing.
Say you want your script to run at noon:
until [[ "$(date)" =~ "12:00:" ]]; do sleep 10 done ./mycommand.sh
Say you want it to run tomorrow at noon (today is Nov 24 for me):
until [[ "$(date)" =~ "25 12:00:" ]]; do sleep 30 done ./mycommand.sh