I know that you can schedule a shutdown for a specific time via shutdown -h 21:45
and that you shouldn't use crontabs for such things because of their repetitive nature. How can I schedule a shutdown for a specific date and time like the 31st of August at 20:00?
6 Answers
The at
command is for scheduling one off future executions.
e.g.
% at 8pm Aug 31
at> echo hello
at> <EOT>
job 161 at Sat Aug 31 20:00:00 2019
(the "<EOT>" was produced by pressing control-D)
% atq
161 Sat Aug 31 20:00:00 2019 a sweh
You can put your shutdown
command here.
-
Yes! I had forgotten about
at
when I posted -at
is definitely meant for this in general, although in a company the accepted method may beat
orcron
, depending on conventions related to configuration management/deployment.– flow2kCommented May 27, 2019 at 4:57 -
It is not exactly equivalent, note. unix.stackexchange.com/q/465322/5132– JdeBPCommented May 27, 2019 at 8:15
-
at
is also able to take commands from a pipe:echo "echo yup > $(tty)" | at now
.– user313992Commented May 27, 2019 at 23:19
Recent Ubuntu versions use systemd and when the conventional atd
and associated at
scheduler for one-off commands is either not installed or not running a one-off command can be scheduled with systemd-run
which is somewhat easier than manually generating a systemd timer
:
systemd-run --on-calendar="2019-08-31 20:00:00 CET" /sbin/shutdown now
-
2The irony is that starting an entire service to do this is almost superfluous. systemd's shutdown mechanism itself supports arbitrary points in time. Its command-line tool simply does not provide the ability to access this, because it is not up to par with the command line of the BSD
shutdown
. As I wrote in another answer, you who want this could try persuading the systemd people to make theirshutdown
tool more capable, with syntax of decades' standing, rather than going around the houses withsystemd-run
.– JdeBPCommented May 28, 2019 at 7:11 -
While at
is the obvious way to do this, I think it will survive shutdowns, so if the machine reboots before the scheduled shutdown, it might shutdown again at the scheduled time. Therefore, using bash and GNU date we can use a delayed shutdown.
/sbin/shutdown +$(( ( $( date -d "30 may 2019 13:15" +%s ) - $( date +%s ) ) / 60 + 1 ))
NB: This is only accurate to one minute. It works by converting the scheduled time, and now to seconds since the UNIX epoch, calculating the difference, converting to minutes, and then using this as the delay to shutdown. It won't work correctly if the scheduled time is in the past.
To run the job only this year:
0 20 31 8 * test $(/bin/date +\%Y) = "2019" && /sbin/shutdown now
To run the job every year:
0 20 31 8 * /sbin/shutdown now
You use a better shutdown
command.
The van Smoorenburg, Upstart, and systemd shutdown
commands do not allow a date specification. But the BSD shutdown
command takes a date value in its specification of when to shut down, in the form yymmddhhmm
. This has been the case ever since 4BSD, and remains so with FreeBSD and OpenBSD. NetBSD extended it to ccyymmddhhmm
.
Because the nosh toolset is also usable on the BSDs, I gave my shutdown
command the same capability, extending it to CCYYMMDDHHMM
per NetBSD. And because the nosh toolset is also usable on Linux, that gives Linux a shutdown command that takes dates.
It of course works with the nosh system-manager
. It also works with some other systems. It sends signals to process #1 to enact stuff and the same signals are understood by some other system managers, such as systemd
, which can also be shut down using it.
You could use it, or a tool like it; or you could try to persuade the authors of other Linux shutdown
programs to extend their tools to also be as capable as the BSD shutdown
.
Further reading
- Jonathan de Boyne Pollard (2018).
shutdown
. nosh toolset manual pages. Softwares. - Jonathan de Boyne Pollard (2018).
system-manager
. nosh toolset manual pages. Softwares. shutdown
. System Manager's Manual. NetBSD Manual pages. 2011-11-04.shutdown
. FreeBSD System Managers' Manual. 2018-01-01.shutdown
. OpenBSD Manual pages. 2015-01-21.- https://unix.stackexchange.com/a/465337/5132
There may be an option to input the year to the shutdown
command, but cron can be used to run commands only once at a specific point in time. For your example, try
0 0 31 8 ? 2019 shutdown
Beware: the above is not standard cron syntax.
-
21. This doesn’t say 20:00 pm, it says midnight. 2. I have never seen a cronjob with SIX fields for the timing. What cron implementation are you referencing?– WildcardCommented May 27, 2019 at 1:25
-
2
-
I realized afterwards this syntax is not "standard cron", so I agree, it should not be taken at face value. OP seems to imply there is a performance penalty associated with using cron, so in my Answer, I sought to clarify - there isn't any inherently inefficient about cron's implementation that makes unsuitable for one-off task. Is this what you think as well?– flow2kCommented May 29, 2019 at 7:43