Answers:
最好的方法取决于原因您要每半小时重新启动Ubuntu。
因此,我建议编辑您的问题以解释为什么要这样做。
假设人们可能正在本地或远程使用该计算机,最好避免在没有任何警告的情况下从其下重新启动Ubuntu。因此,reboot
建议您不要安排命令,而是安排shutdown
命令,以便它警告用户。
要安排每半小时关闭一次并在5分钟前发出警告,请将其添加到 /etc/crontab
:
#minute hour mday month wday user command
*/30 * * * * root shutdown -r +5
您实际上不必添加第一行,这是一条注释。为了清楚起见,我将其包括在内-好像已经存在了。
-r
在(+5
)命令运行五分钟后停机以重启()。它每隔半小时运行一次(*/30
)。看到man cron
和man 5 crontab
。+5
为其他内容以更改警告用户重启后的时间。0,30
如果您愿意的话,不到一分钟也可以使用。(类似地,如果每20分钟写一次*/20
或0,20,40
。)/sbin
的PATH
变量中/etc/crontab
。否则,shutdown
(下的command
)将必须作为/sbin/shutdown
。如果机器当时已启动并正在运行,则该命令将始终在半小时标记上运行。这将导致每半小时宣布关闭一次,并在每小时之后的5分钟和35分钟执行一次。
sudo shutdown -c
。shutdown
如果您要安排时间,则同样适用reboot
。)在这种情况下,请编辑问题以解释您的特定需求。(我anacron
为此建议,但是您的时间间隔太短了。)您可能需要进行设置,以便管理员可以轻松地暂停所有自动计划的重启:
#minute hour mday month wday user command
*/30 * * * * root [ -e /etc/noautoreboot ] || shutdown -r +5
此计划以每半小时一次的方式进行重新引导,警告时间为五分钟,不同之处在于,如果noautoreboot
存在名为的文件,则不会安排重新引导/etc
。
管理员可以使用以下命令创建此控制文件:
sudo touch /etc/noautoreboot
可以使用以下方法删除它:
sudo rm /etc/noautoreboot
请注意,重要的是文件是否存在而不是文件所包含的内容。
如果计划了重新启动并警告了用户,则创建了文件,(立即即将发生的)重新启动仍然会发生。
这是如何运作的?它使用短路评估或运算符(||
)作为以下各项的简写:
如果
/etc/noautoreboot
不存在,请运行shutdown -r +5
。
这个答案解释了短路和和或运算符如何执行if
- then
逻辑。对于简短,直观和高度非正式的解释,您可以通过以下方式阅读命令:
/etc/noautoreboot
存在!或者,运行shutdown -r +5
。
请参阅man [
以查看测试本身是如何执行的。
我喜欢通过告诉会话管理器我们要重启来做到这一点。这可以在没有root权限的情况下完成,并且我们会看到一个漂亮的窗口,警告我们系统将要重新启动-即使我们愿意,也可以取消重新启动。
安装 gnome-schedule
从Ubuntu软件中心。如果您不想安装其他任何东西,请执行Terminal Way。
gnome-schedule
从破折号打开,创建一个新的重复任务,并设置以下选项:
dbus-send --print-reply --dest="org.gnome.SessionManager" /org/gnome/SessionManager org.gnome.SessionManager.Reboot
将其他选项保留为默认值。点击添加。
从终端运行:
crontab -e
添加此行:
0,30 * * * * DISPLAY=:0 dbus-send --print-reply --dest="org.gnome.SessionManager" /org/gnome/SessionManager org.gnome.SessionManager.Reboot
保存并退出。假设您正在使用nano
(默认设置),请按Ctrl + o和Ctrl + x。
请注意,如果您的DISPLAY与实际不同:0
,则此方法将不起作用,这就是不推荐使用此方法的原因。但是,老实说,如果您每30分钟重新启动计算机一次,则DISPLAY很可能永远是:0
。
上面说明的两种方法都依赖于一些gnome组件,这些组件都可以在Gnome会话和Unity上找到。如果要在其他环境(例如Kubuntu的KDE,Kubuntu的LXDE ...)上执行此操作,则最好用以下命令替换该命令:
dbus-send --system --print-reply --dest="org.freedesktop.ConsoleKit" /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.Restart
当然,这不会要求您进行确认,并且会立即重新启动,但是在所有环境中都可以使用,前提是您没有手动卸载ConsoleKit。
运行sudo crontab -e
命令行,这行添加到文件:
0,30 * * * * reboot
这告诉系统以reboot
root身份每30分钟运行一次命令。有关时间语法的概述,请参见此处:http : //linuxmoz.com/crontab-syntax-tutorial/
reboot
运行,因为必须以方式运行root
,并将其添加到用户的个人crontab中,因此它将以该非root用户身份运行。(与相同的东西sudo reboot
也将不起作用,因为sudo
它将尝试提示输入密码并失败。)/etc/crontab
应对此进行替代(请注意,其语法略有不同)。
sudo crontab -e
然后创建一个cron条目。
用于cron
每30分钟安排一次作业。将该工作指向一个简单的shell脚本
reboot
在里面。
以来 cron
是以root身份运行的,因此就权限而言,您不需要做任何特殊的事情。
是的,我确实这样做,实际上我从来没有在任何系统上允许基于用户的crontabs(有更好的方法允许用户执行用户级的计划任务)cron从一开始就设计纯粹是为了系统自动化,而不是供用户计划普通的任务。日志旋转之类的事情(今天仍然发生)
重新启动必须以root身份运行才能正常工作,另一种方法是设置它的粘性位,以便当以普通用户身份运行时,它实际上以root身份运行并按预期运行,但是这样做之后,您需要打开服务器以允许正常运行用户可以随意重新启动它。
您甚至可以自动执行一次SUDO调用,但我需要深入研究这一点,不确定是否可以使用SUDO来自动输入密码(我不经常使用它,我更喜欢直接输入root使用SU的外壳)
如果在系统范围的crontab中进行设置,那么所有内容都将以root身份运行,因此我的说法是准确的(我只是忽略了应该使用系统范围的内容)
至于您的问题“为什么要用脚本包装?” 好吧,为什么不呢?如果OP将其放在shell脚本中,那么将来需要添加到该脚本中,他只需将其添加到脚本中,而不必打开crontab定位该作业,将其删除,然后将其替换为shell脚本,然后用新旧代码编写脚本。
作为系统管理员/开发人员,使用可追溯到Ultrix / Solaris甚至VAX的系统已有20多年的经验,它教会了我一个重点。
如果您可以从一开始就使它变得更容易,那么一生中仍然很容易。
我真的没有现代许多系统管理员所拥有的“简约”态度,在这种情况下,尽可能少地做是成功的关键。如今,大多数服务器的功能都比我刚开始使用的任何服务器都要强大20倍以上,因此建议在这种情况下(使用Shell脚本包装),因此现在没有理由不这样做。
除非您真的想使用Unix / Linux硬核,否则将其标记在cron条目上,并按照应做的方式将所有内容通过管道传输:-)
但是,我确实离题了,也了解到,如今有很多人陷入困境,被告知要使事情行之有效,因此他们没有时间(通常是倾向)坐下来学习新技术(或甚至在工作以外都想玩这些东西。
我个人而言,在我运行的服务器中只有一台服务器专门用于我的游戏,因此我可以测试类似的东西……最好是A或B,因此我不无理由建议任何一个这个。