linux - 当关联的停止后进程被终止时,进程不会重生

标签 linux init upstart

我有一个进程xyz,它的upstart脚本如下

description "Run the xyz daemon"
author      "xyz"

import SETTINGS

start on (
  start-ap-services SETTINGS
)
stop on (
  stop-ap-services SETTINGS
) or stopping system-services

respawn
oom score 0

script
  . /usr/share/settings.sh

  # directory for data persisted between boots
  XYZ_DIR="/var/lib/xyz"
  mkdir -p "${XYZ_DIR}"
  chown -R xyz:xyz "${XYZ_DIR}"

  if [ "${SETTING}" = 1 ]
      ARGS="$ARGS --enable_stats=true"
  fi

    # CAP_NET_BIND_SERVICE, CAP_DAC_OVERRIDE.
    exec /sbin/minijail0 -p -c 0x0402 -u xyz -g xyz \
      -G /usr/bin/xyz ${ARGS}
  else
    exec sleep inf
  fi
end script

# Prevent the job from respawning too quickly.
post-stop exec sleep 3

现在,由于 OOM 问题。 xyz 根据其 OOM 分数被杀死,并按预期重生。在 xyz 几次重启后,停止后 sleep 被终止,之后 xyz 永远不会重生。

如何避免这种情况或有什么解决方案吗?

注意:名称 xyz 是一个虚拟进程名称,仅用于提及我的实际疑问。

我以前没有处理过 upstart 脚本。任何帮助都会有更大的帮助。

最佳答案

当停止后、开始前和开始后部分在重生期间仍然运行时, Upstart 可能会感到困惑。

我更喜欢将任何超过几百毫秒的命令保留在主要作业部分,必要时使用辅助作业。

例如,这将停止正在重生或停止的作业 xyz:

start on stopping xyz RESULT='ok'
task
exec sleep 3

这与您的停止后节具有相同的效果,除了 Upstart 可以更好地处理简化主作业的状态跟踪。

关于linux - 当关联的停止后进程被终止时,进程不会重生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54002391/

相关文章:

java - 使用 tuckey-urlrewrite-filter rermote-addr 阻止 IP

c - 如何在linux中用c在文件中打洞以删除数据

linux - LSB 注释不完整。插入 : missing valid name for `Provides:' please add

android - 致命的 : [Errno 13] Permission denied when repo init android source 4. 1

node.js - 进程将二进制数据记录到日志文件

node.js - Upstart | Ubuntu | Node |无法在脚本 block 内运行多个 exec

Amazon EC2 Linux (Elasticbeanstalk) 上的 PHP Upstart

linux - 在 Linux 上将已经编码的数据流式传输到网络

php - 在 bash 脚本中运行命令产生错误

package - 如何在我自己的程序中打包Tcl库?