如何在 CentOS 上关机前运行 Shell 脚本

Posted

技术标签:

【中文标题】如何在 CentOS 上关机前运行 Shell 脚本【英文标题】:How to run a Shell Script before shutdown on CentOS 【发布时间】:2013-09-24 08:08:19 【问题描述】:

我想在系统即将关闭时向一个电子邮件 ID 发送一封电子邮件。我有 CentOS 6.4。下面是我的脚本。

cat /ect/init.d/sendshtmail

#!/bin/bash

EMAIL="example@example.com"
SHUTDOWNSUBJECT="["`hostname`"] - System Shutdown"


SHUTDOWNBODY="This is an automated message to notify you that "`hostname`" is shutting down.

LOCKFILE=/var/lock/subsys/SystemEmail
echo "$SHUTDOWNBODY" | mutt -s "$SHUTDOWNSUBJECT" $EMAIL

它具有适当的权限。手动运行它时,它运行良好。我刚刚将它符号链接到 /etc/rc0.d/ 文件夹。通过发出以下命令。

 ln -s /etc/init.d/sendshtmail /etc/rc0.d/K00sendshtmail

但脚本在关机期间没有发送任何电子邮件。提前致谢。

【问题讨论】:

【参考方案1】:

将您的 shell 脚本放在具有可执行权限的 /etc/init.d 中,并且符号链接名称应以 K## 开头。如果你想在关机后立即执行你的脚本,那么用 K00scriptname 命名它。启动的脚本会先按照升序执行 K 再执行 S 的脚本。

ln -s /etc/init.d/script /etc/rc0.d/K00scriptname

关机命令会向脚本发送停止信号,你的脚本(K00scriptname)应该像例子一样有停止功能

stop()

  echo "executing scriptname"
  "Your script logic"

case "$1" in
  stop)
    stop
    ;;
esac

最重要的是,K00scriptname 只有在 /var/lock/subsys 文件夹中存在锁定文件时才会执行,因此请执行“touch /var/lock/subsys/scriptname”然后通过关闭进行检查。强>

【讨论】:

【参考方案2】:

ln -s /etc/init.d/sendshtmail /etc/rc0.d/S01sendshtmail

符号链接名称应以 S 开头 - 表示开始(K 表示终止)

两位数指定脚本的执行顺序,编号最小的先执行。

【讨论】:

【参考方案3】:

尝试为您的脚本设置可执行权限。有时您需要这样做才能激活它。

chmod 755 /etc/init.d/sendshtmail

还可以尝试为您的命令使用绝对路径,同时引用其他变量。

echo "$SHUTDOWNBODY" | /usr/bin/mutt -s "$SHUTDOWNSUBJECT" "$EMAIL"

另一种尝试是将您的用户切换到当前用户,例如

echo "$SHUTDOWNBODY" | su -l -c "/usr/bin/mutt -s \"$SHUTDOWNSUBJECT\" \"$EMAIL\"" yourusername

【讨论】:

正如我在脚本获得适当权限之前告诉你的那样。但是,我通过再次添加权限进行了仔细检查。仍然没有运气:( @tapasmishra 请查看更新。您还可以通过在开头添加set -x 来调试您的脚本。您至少应该看到脚本中执行的行。 @tapasmishra 在脚本的开头使用 set -x(在 #! 标头之后),您应该已经看到脚本的行在执行之前显示出来。如果没有,您的脚本可能根本没有运行(除非 stderr 被 rc 系统抑制,这是不太可能的)。如果它确实运行但邮件仍然不起作用,请使用您看到的那些调试消息更新线程,以便人们可以提供有关它的想法。 你可以在脚本的开头定义 PATH,而不是使用命令的绝对路径吗? @konsolebox @Saichovsky 如果您以 OP 的示例为例,是的。但我不明白这会有什么不同。

以上是关于如何在 CentOS 上关机前运行 Shell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

虚拟机centos在救援模式下,关机的命令是啥?为啥我输入init 0 之后就卡住了?

CentOS7关机或重启前执行特定脚本

centos服务器意外关机,如何查看关机原因?

Centos开机自动执行shell脚本启动tomcat服务器

Centos7 关机与重启

shell脚本