我有一个在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目标,但是从文档中我看不到做我想做的事情。
答案 0 :(得分:1)
CameronNemo的评论是正确的。 man systemd.special
或http://linuxmanpages.net/manpages/fedora14/man7/systemd.special.7.html中描述了特殊的systemd目标,并且重新启动时重新启动目标处于活动状态。但是,关闭目标在任何形式的系统终止时都是活动的,无论是重新启动还是停止,因此它不会有助于区分。对于其他感兴趣的目标,请参阅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"
当关闭系统时,它总是说"关闭"然后取决于重启或断电"重新启动"或者"断电"。 /sbin/halt
会导致"暂停"。当我尝试时,shutdown -h now
转换为关闭电源,但这可能取决于虚拟环境和物理环境。我使用Fedora 20(ami-21362b48)和CentOS7(ami-96a818fe)在EC2 us-east进行了测试。如果您遇到的情况不起作用,请发表评论,我会尝试修复!