在特定日期关闭


11

我知道您可以通过安排特定时间的关机,shutdown -h 21:45并且由于其重复性,您不应该将crontabs用于此类事情。如何安排在特定日期(例如8月31日下午20:00)关闭?

Answers:


7

近期的Ubuntu版本使用systemd,并且可以在未安装常规atd和相关的一次性命令调度程序的情况下进行调度, 而该调度程序可以比手动生成a容易一些: atsystemd-runsystemd timer

 systemd-run --on-calendar="2019-08-31 20:00:00 CET" /sbin/shutdown now

2
具有讽刺意味的是,启动整个服务来执行此操作几乎是多余的。systemd的关闭机制本身支持任意时间点。它的命令行工具根本无法提供访问此功能的能力,因为它不符合BSD的命令行shutdown。正如我在另一个答案中所写的那样,想要这样做的人可以尝试说服系统的人们shutdown使用数十年的语法使他们的工具更加强大,而不是带着systemd-run
JdeBP

我收到无效的日历规范:2019-08-31 20:00:00 CET
HdM上传

12

at命令用于计划将来执行一次。

例如

% at 8pm Aug 31
at> echo hello
at> <EOT>
job 161 at Sat Aug 31 20:00:00 2019

(“ <EOT>”是通过按Control-D产生的)

% atq
161     Sat Aug 31 20:00:00 2019 a sweh

您可以将shutdown命令放在这里。


是! 我已经忘记了at发布的时间- at总体上来说绝对是为了这个目的,尽管在公司中可接受的方法可能是atcron,具体取决于与配置管理/部署相关的约定。
flow2k

请注意,它并不完全等效。 unix.stackexchange.com/q/465322/5132
JdeBP,

at还能够从管道中接收命令:echo "echo yup > $(tty)" | at now
mosvy

7

虽然这at是显而易见的方法,但我认为它可以在关机后继续运行,因此,如果计算机在计划的关机之前重新启动,则它可能会在计划的时间再次关机。因此,使用bash和GNU date,我们可以使用延迟关闭。

/sbin/shutdown +$(( ( $( date -d "30 may 2019 13:15" +%s ) - $( date +%s ) ) / 60 + 1 ))

注意:这只精确到一分钟。它的工作原理是将计划的时间(现在是UNIX时代以来的秒)转换为秒,计算时差,转换为分钟,然后将其用作关闭延迟。如果计划的时间是过去的时间,它将无法正常工作。


3

您使用更好的shutdown命令。

van Smoorenburg,Upstart和systemd shutdown命令不允许指定日期。但是BSD shutdown命令在其何时关闭的规范中采用日期值,格式为yymmddhhmm。从4BSD开始就是这种情况,而FreeBSD和OpenBSD仍然如此。NetBSD将其扩展到ccyymmddhhmm

因为nosh工具集也可在BSD上使用,所以我给了shutdown命令相同的功能,将其扩展到了CCYYMMDDHHMM每个NetBSD。而且由于nosh工具集也可以在Linux上使用,因此可以给Linux一个带日期的shutdown命令。

它当然适用于nosh system-manager。它也可以与其他一些系统一起使用。它将信号发送到进程#1来制定内容,其他一些系统管理器(例如)systemd也可以理解相同的信号,也可以使用它来关闭该信号。

您可以使用它或类似的工具;或者您可以说服其他Linux shutdown程序的作者扩展其工具,使其具有与BSD一样的功能shutdown

进一步阅读

  • 乔纳森·德博因·波拉德(2018)shutdown。nosh工具集手册页。软件。
  • 乔纳森·德博因·波拉德(2018)system-manager。nosh工具集手册页。软件。
  • shutdown系统管理员手册。NetBSD手册页。2011-11-04。
  • shutdownFreeBSD系统管理员手册。2018年1月1日。
  • shutdown。OpenBSD手册页。2015年1月21日。
  • /unix//a/465337/5132

1

要仅在今年开始工作:

0 20 31 8 * test $(/bin/date +\%Y) = "2019" && /sbin/shutdown now

每年运行该工作:

0 20 31 8 * /sbin/shutdown now

-4

可以输入shutdown命令的年份,但是cron只能在特定的时间点运行一次命令。例如,尝试

0 0 31 8 ? 2019  shutdown

当心:以上不是标准的cron语法。


2
1.这不是说20:00 pm,而是午夜。2.我从未见过带有六个字段的cronjob作为计时。您引用的是什么cron实现?
通配符

2
没有一个year在该领域crontab的时间表
西莫

后来我意识到这种语法不是“标准的cron”,因此我同意,不应以表面价值为准。OP似乎暗示使用cron会导致性能下降,因此在我的答案中,我试图澄清-cron的实现没有内在的效率低下,使其不适合一次性任务。这也是您的想法吗?
flow2k
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.