关机时运行脚本

关机时运行脚本

我有以下脚本,如何在 Debian Linux 关机时运行它?(不想使用 GUI)

#!/bin/bash
vms=$(vmrun list | grep '/');
for vm in ${vms}
do
        echo 'suspending ' $vm
        vmrun suspend $vm soft
done

我尝试使用 chmod +x 权限将其添加到 /usr/local/bin。然后我创建了指向 rc0.d(关机)和 rc6.d(重启)的符号链接。

然后我执行了 update-rc.d shutdown_vms 0 6 。

当我现在执行shutdown -r时,它会切换到控制台模式重新启动....此时我可以看到一条错误消息,指出shutdown_vms已失败。

这是安装关机脚本的正确方法,但为什么它会失败(我应该在哪里查看日志?)

编辑:我使用了命令 update-rc.d -f shutdown_vms start 0 0 6 。

当我查看 rc0.d(关机)的启动列表时,我发现 shutdown_vms、vmware 和 gdm 的顺序都是 0。我认为,如果 gdm 在 shutdown_vms 之前触发,它将杀死虚拟机。我认为这就是正在发生的事情,因为当我记录脚本执行时正在运行的虚拟机数量时,它记录的是 0。

我可以将 gdm/vmware 的顺序改为 1 以便 shutdown_vms 首先运行吗?

答案1

看起来你应该把它作为“停止”方法放入适当的初始化脚本中。你当前的脚本可能会失败,因为退出代码不等于零。

除此之外,您还应该用“$()”括起来,因为您的虚拟机列表可能包含空格。

通过 测试您的脚本sh -x YOURSCRIPT stop

答案2

尝试添加:在完成时退出 0。

因此,看起来 gdm 在关机过程中执行了此操作。也许更好的方法是让 vms 脚本测试是否确实需要执行关机过程。在这种情况下,它不会关闭不存在的进程。这个不存在的进程可能导致了您的错误消息。

答案3

您是否已将 /etc/rc[06].d 目录中的文件命名为以“K”开头?如果没有,则它们不会在关机时执行。

答案4

嗯...如果能显示失败输出就好了。这可能会轻松澄清一些事情。

还有一个想法,尝试在#!/bin/sh 之后立即输入 PATH 语句。

 #! /bin/sh
 PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:.....<anything else you need>
 export PATH
 .
 .   (rest of script)
 .
 exit 0

我对 vmlist 不熟悉。

相关内容