我有一台服务器,出于安全原因,它通常会关闭。当我想要处理它时,我会打开它,执行我的任务,然后再次关闭它。我的任务通常不会超过 15 分钟。我想实现一个60分钟后自动关闭的机制。
我研究了如何使用 cron 来执行此操作,但我认为这不是正确的方法,因为 cron 没有考虑服务器上次打开的时间。我只能设置周期性模式,但他们不会考虑这些数据。
我该如何执行此实施?
答案1
答案2
这看起来像一个XY问题。
我的任务通常不会超过 15 分钟。我想实现一个60分钟后自动关闭的机制。
如果您在 60 分钟后关闭,则可能会遇到一个特别复杂的问题,并且需要更多时间。以前的许多解决方案并不容易延迟关闭。
如果任务不是交互式任务,而是从另一台机器自动触发的脚本任务,@sdkks 给出一个很好的解决方案为此;您实际上应该只是让机器在脚本及其所有任务完成后立即运行关机。
但是,如果您的任务是交互式任务,我建议改为进行空闲检测。
如果您在 GUI (X11) 中执行任务,您可以使用此处描述的方法检测空闲 GUI 会话:系统空闲时和再次活动时运行命令
如果您通过终端执行该任务,则可以使用该who
命令检测登录的用户。您可以设置一个 cronjob,如果who
返回空结果则关闭机器。请注意,这将是一种相当保守的方法;如果您让控制台处于连接状态但处于闲置状态,它不会关闭系统。
如果您想更积极一点并断开空闲终端会话,您可以将前面的方法与自动断开空闲的 SSH 会话 ClientAliveInterval
和ClientAliveCountMax
。如果您没有 SSH,但有本地终端会话,另一种方法是使用终端闲置的命令返回的时间w
。
答案3
如果您每次都以同一用户身份执行任务,则只需将 shutdown 命令(可选地使用选项 -P)添加到您的配置文件中即可。该数字代表关闭命令延迟的分钟数。确保您的用户能够在没有密码的情况下通过 sudo 执行关闭命令。
echo "sudo shutdown -P +60" >> ~/.profile
添加:
在阅读了大多数其他答案后,我喜欢在(根)cron 中添加“@reboot /<脚本/命令的路径>”的选项。 Sebasth给出的答案是他的第四个选择。您可以添加关闭命令或编写一个执行关闭的小脚本并通过 cron 执行。如果您使用 systemd,WoJ 也有一个很好的解决方案。
答案4
以下命令command
使用参数运行,如果成功完成,它将立即关闭该框(假设用户可以运行)poweroff
。可能需要使用sudo poweroff
.
command --parameters && poweroff
而以下命令只是poweroff
在命令终止时立即运行:
command --parameters ; poweroff
如果您认为命令完成后需要休息时间,请运行
command --parameters ; sleep 3600 ; poweroff
如果您认为该命令可能会超时运行,您可以将其限制为一个小时:
timeout 1h command --parameters ; poweroff
timeout
是软件包的一部分coreutils
,因此您可能已经拥有它。