Linux systemd控制的服务如何区分关机和重新启动?

Linux systemd控制的服务如何区分关机和重新启动?,linux,rhel,systemd,Linux,Rhel,Systemd,我有一个运行在RHEL7上的Linux进程,由systemd启动。当进程停止时,我需要知道它是否因为系统关闭或重新启动而停止,并且我需要能够区分这两者 以前,在RHEL6上的init下,我可以通过查看用于调用我的init脚本的路径名来执行此操作,并相应地向进程发送一个不同的信号,即: case "$0" in *rc0\.d*|*rc1\.d*) #shutdown sig=USR1 ;; *rc6\.d*) #reboot

我有一个运行在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目标,但从文档中我看不到一种实现我所希望的方法。

CameronNemo的评论是正确的。特殊systemd目标在man systemd.special或中描述,并且重新启动时重新启动目标处于活动状态。但是,关机目标在任何形式的系统终止时都处于活动状态,无论是重新启动还是停止,因此它无助于区分。有关其他感兴趣的目标,请参见
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现在
在我尝试时会转换为关机,但这可能取决于虚拟环境和物理环境。我使用Fedora 20(ami-21362b48)和CentOS7(ami-96a818fe)在EC2美国东部进行了测试。如果你遇到这样的情况,请留下评论,我会设法解决

您可以尝试使用
systemctl处于活动重新启动状态。target
systemctl处于活动关闭状态。target
BTW,pre-systemd解决问题的典型方法是调用
runlevel
并查看打印的当前运行级别(第二个字母/数字)。这相当于您的rcN测试,只是稍微干净了一点。原来
systemctl处于活动状态…
不可靠,因为当另一个关机单元运行时,reboot.target可能处于等待状态。我现在集中讨论
/usr/bin/systemctl列表作业| egrep-q“reboot.target.*start”和&echo“rebooting”| echo“not rebooting”
。我会更新的答案,一旦我有更多的清晰度。。。