11

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 like 31st of August at 20:00pm?

6

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
  • 2
    The 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 their shutdown tool more capable, with syntax of decades' standing, rather than going around the houses with systemd-run. – JdeBP May 28 at 7:11
  • I get Invalid calendar spec: 2019-08-31 20:00:00 CET – HdM Upload Jun 2 at 14:44
12

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 be at or cron, depending on conventions related to configuration management/deployment. – flow2k May 27 at 4:57
  • It is not exactly equivalent, note. unix.stackexchange.com/q/465322/5132 – JdeBP May 27 at 8:15
  • at is also able to take commands from a pipe: echo "echo yup > $(tty)" | at now. – mosvy May 27 at 23:19
7

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.

3

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

1

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
-4

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.

  • 2
    1. 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? – Wildcard May 27 at 1:25
  • 2
    There isn't a year field in the crontab schedule – Seamus May 27 at 2:06
  • 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? – flow2k May 29 at 7:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.