如何在shell脚本中触发延迟的系统关闭?

时间:2013-11-18 11:42:52

标签: linux bash shell shutdown

在我的专用网络上,我有一个备份服务器,每晚运行bacula备份。为了节省能源,我使用cron作业来唤醒服务器,但我还没有发现,如何在备份完成后正确关闭它。 通过bacula-director配置,我可以在处理最后一个备份作业(即文件目录的备份)期间调用脚本。我试着使用这个脚本:

#!/bin/bash
# shutdown server in 10 minutes
#
# ps, 17.11.2013
bash -c "nohup /sbin/shutdown -h 10" &
exit 0

该脚本关闭服务器 - 但显然它只是在关闭期间返回, 因此,上次备份作业会一直挂起,直到关机。如何使脚本提交关闭并立即返回?

更新:经过广泛搜索后,我提出了一个(尽管很难看)解决方案: bacula运行的脚本如下所示:

#!/bin/bash
at -f /root/scripts/shutdown_now.sh now + 10 minutes

第二个脚本(shutdown_now.sh)如下所示:

#!/bin/bash
shutdown -h now

实际上我发现没有明显的方法可以在'at'命令的语法中添加所需的shutdown参数。也许有人可以在这里给我一些建议。

3 个答案:

答案 0 :(得分:4)

根据您的备份服务器的操作系统,shutdown的实现可能会有不同的行为。我在Ubuntu 12.04上测试了以下两个解决方案,他们都为我工作:

作为root用户,我创建了一个包含以下内容的shell脚本,并在bash shell中调用它:

shutdown -h 10 &
exit 0

shell中脚本的退出代码是正确的(使用echo $?进行测试)。关机仍在进行中(使用shutdown -c测试)。

第二个shell脚本中的这个bash函数调用同样运行良好:

my_shutdown() {
  shutdown -h 10
}
my_shutdown &
exit 0

答案 1 :(得分:3)

无需创建第二个BASH脚本来运行shutdown命令。只需在备份脚本中替换以下行:

bash -c "nohup /sbin/shutdown -h 10" &

用这个:

echo "/sbin/poweroff" | /usr/bin/at now + 10 min >/dev/null 2>&1

随意调整时间间隔以满足您的偏好。

答案 2 :(得分:0)

If you can become root: either log in as, or sudo -i this works (tested on ubuntu 14.04):

# shutdown -h 20:00 & //halts the machine at 8pm

No shell script needed. I can then log out, and log back in, and the process is still there. Interestingly, if I tried this with sudo in the command line, then when I log out, the process does go away!

BTW, just to note, that I also use this command to do occasional reboots after everyone has gone home.

# shutdown -r 20:00 & //re-boots the machine at 8pm