首页 文章

systemd受控服务如何区分关机和重启?

提问于
浏览
3

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

以前,在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目标,但是从文档中我看不到做我想要的方法 .

1 回答

  • 1

    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"然后取决于重启或断电"rebooting"或"powering down" . /sbin/halt 将导致"halting" . 当我尝试时, shutdown -h now 转换为关闭电源,但这可能取决于虚拟环境和物理环境 . 我've tested in EC2 us-east using Fedora 20 (ami-21362b48) and CentOS7 (ami-96a818fe). If you come across a situation where this doesn'工作请发表评论,我会尽力解决!

相关问题