linux - systemd 控制的服务如何区分关机和重启?

标签 linux rhel systemd

我有一个在 RHEL7 上运行并由 systemd 启动的 Linux 进程。当进程停止时,我需要知道它是因为系统关闭还是重启而停止,并且我需要能够区分这两者。

以前,在 RHEL6 的 init 下,我能够通过查看用于调用我的 init 脚本的路径名来做到这一点,并相应地向进程发送不同的信号,即:

case "$0" in 
    *rc0\.d*|*rc1\.d*)     #shutdown
    sig=USR1
    ;;
    *rc6\.d*)              #reboot
    sig=USR2
    ;;
    *)
    sig=TERM
    ;;
esac

这不适用于 systemd...虽然我的 init 脚本在正确的时间被调用,但 $0 始终相同(/etc/init.d/scriptname)。

在 systemd 下有没有什么方法可以知道你是因为系统关闭还是重启而被调用?我很高兴摆脱 init 脚本并将其配置为 systemd 目标,但是从文档中我看不到做我想做的事情的方法。

最佳答案

CameronNemo 的评论是正确的。特殊的 systemd 目标在 man systemd.specialhttp://linuxmanpages.net/manpages/fedora14/man7/systemd.special.7.html 中描述。并且重启目标在重启时处于事件状态。但是,关闭目标在任何形式的系统终止时都处于事件状态,无论是重新启动还是停止,因此它无助于区分。对于其他感兴趣的目标,请参阅 man telinit。我已成功使用以下类型的代码:

/usr/bin/systemctl list-jobs | egrep -q 'shutdown.target.*start' && echo "shutting down" || echo "not shutting down"
/usr/bin/systemctl list-jobs | egrep -q 'reboot.target.*start' && echo "-> rebooting" || echo "-> not rebooting"
/usr/bin/systemctl list-jobs | egrep -q 'halt.target.*start' && echo "-> halting" || echo "-> not halting"
/usr/bin/systemctl list-jobs | egrep -q 'poweroff.target.*start' && echo "-> powering down" || echo "-> not powering down"

当关闭系统时,它总是会说“shutting down”,然后根据重启或 poweroff 也会说“rebo​​oting”或“powering down”。 /sbin/halt 将导致“停止”。 shutdown -h now 在我尝试时转换为关机,但这可能取决于虚拟环境与物理环境。我已经使用 Fedora 20 (ami-21362b48) 和 CentOS7 (ami-96a818fe) 在 EC2 us-east 中进行了测试。如果您遇到这不起作用的情况,请发表评论,我会尽力解决!

关于linux - systemd 控制的服务如何区分关机和重启?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25166085/

相关文章:

linux - systemd 强制服务在 CentOS 7.1 中继续之前完成

linux - 如何防止 Cronjob 创建文件

python - RPM 与 Python Virtualenv 冲突

embedded-linux - Yocto SYSTEMD_SERVICE 安装参数化服务 ("@.service")

linux - 在/var/log/messages中,: Watching system buttons [.是什么..] Power Button

linux - ProFTPd 支持 MLST 和 MLSD 命令

c - 嵌入式 linux 编程入门套件

linux - 哪些 ESQL/C 函数可以直接从 C 代码调用?

Java 声音在 Windows 中完美运行,在 Linux 中我们得到 LineUnavailableException

ruby - RHEL 6.3 和所有 Ruby 安装程序上的 OpenSSL 问题