linux – Systemd – 在ExecStopPost中检测服务是否退出而没有错误

我有一个应用程序,它完成后正常退出不应该重新启动.在此应用程序完成其业务之后,我想关闭实例(ec2).我正在考虑使用带有选项的systemd单元文件来执行此操作

Restart=on-failure
ExecStopPost=/path/to/script.sh

应该在ExecStopPost上运行的脚本:

#!/usr/bin/env bash

# sleep 1; adding sleep didn't help

# this always comes out deactivating
service_status=$(systemctl is-failed app-importer) 

# could also do the other way round and check for failed
if [ $service_status = "inactive" ] 
then
  echo "Service exited normally: $service_status . Shutting down..."
  #shutdown -t 5
else
  echo "Service did not exit normally - $service_status"
fi
exit 0

问题是,当后停止运行时,我似乎无法检测服务是否正常结束,状态然后是停用,只有在我知道它是否进入失败状态之后.

最佳答案
您的问题是systemd在ExecPostStop进程完成之前认为该服务已停用.睡觉并没有帮助,因为它只会等待更长时间. ExecPostStop的想法是清理服务可能留下的任何内容,如临时文件,UNIX套接字等.服务未完成,并准备重新启动,直到清理完成.因此,如果你以这种方式看待它,那么systemd正在做什么是有意义的.

你应该做的是检查脚本中的$SERVICE_RESULT,$EXIT_CODE和/或$EXIT_STATUS,它将告诉你服务是如何停止的.例:

#!/bin/sh
echo running exec post script | logger
systemctl is-failed foobar.service | logger
echo $SERVICE_RESULT,$EXIT_CODE and $EXIT_STATUS | logger

当服务允许运行完成时:

Sep 17 05:58:14  systemd[1]: Started foobar.
Sep 17 05:58:17  root[1663]: foobar service will now exit
Sep 17 05:58:17  root[1669]: running exec post script
Sep 17 05:58:17  root[1671]: deactivating
Sep 17 05:58:17  root[1673]: success,exited and 0

当服务在完成之前停止时:

Sep 17 05:57:22  systemd[1]: Started foobar.
Sep 17 05:57:24  systemd[1]: Stopping foobar...
Sep 17 05:57:24  root[1643]: running exec post script
Sep 17 05:57:24  root[1645]: deactivating
Sep 17 05:57:24  root[1647]: success,killed and TERM
Sep 17 05:57:24  systemd[1]: Stopped foobar.

相关文章

linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、...
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别...
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书...
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满...
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的...
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线...