如何在 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 之后就卡住了?