首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >停止不调用init rc.d服务

停止不调用init rc.d服务
EN

Unix & Linux用户
提问于 2023-04-18 03:28:27
回答 1查看 49关注 0票数 0

我在/etc/rc.d中有一个非常简单的D0服务:

代码语言:javascript
复制
#!/bin/bash

PIDFILE="/var/run/test.pid"

status() {
  if [ -f "$PIDFILE" ]; then
    echo 'Service running'
    return 1
  fi
  return 0
}

start() {
  if [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")"; then
    echo 'Service already running'
    return 1
  fi
  echo 'Starting...'
  test & echo $! > "$PIDFILE"
  return 0
}

stop() {
  if [ ! -f "$PIDFILE" ] || ! kill -0 "$(cat "$PIDFILE")"; then
    echo 'Service not running'
    return 1
  fi
  echo 'Stopping...'
  kill -15 "$(cat "$PIDFILE")" && rm -f "$PIDFILE"
  return 0
}

case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac

当系统启动时,它将启动服务。

但是当系统停止时,它从不调用停止命令。我可以考虑的唯一原因是,系统要么认为服务没有运行,要么没有正确启动。

但是,这方面的要求是什么?

  • 是否需要为start命令返回特殊的exitcode?
  • 我是否需要在/var/lock/subsys中创建一个文件来表示它是活动的?
  • 还有什么可能导致系统认为服务没有启动的吗?
EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2023-04-18 20:42:06

看起来,Synology在DSM 6中从经典的SysVinit迁移到了upstart,然后在DSM 7中转到了systemd。这两个init系统都为经典的SysVinit风格的开始/停止脚本提供了向后兼容性,但是有一些怪癖你应该知道。

如果您有DSM7.0或更高版本,那么在安装脚本之后,您可能应该运行systemctl daemon-reload,因此systemd-sysv-generator应该为它自动创建一个.service文件(可能在/run/systemd中)。然后您可以使用systemctl start </code>启动脚本,实际上应该这样做,而不是手动运行脚本。只有当<strong> <code>systemd</code> </strong>实际执行了相应的启动作业时,它才会意识到运行<code><your script> stop</code>作业的必要性。</div><div>这是因为<code>systemd</code>将在启动每个服务时将其设置为一个单独的进程控制组(而手动运行start脚本的管理员不会这样做)。</div><div>对于服务本身来说,这是完全不可见的(除非它们专门去寻找它),服务的任何子进程都将继承此控制组成员资格。如果控制组中没有剩余的进程,它将自动停止存在。</div><div>当关闭时,<code>systemd</code>将只遍历现有的控件组,并为它找到的任何非默认控件组运行停止命令。没有使用<code>systemctl start</code>而启动的任何服务都将是“管理员的交互式会话”控件组的一部分,而不是“服务X”控件组,并且基本上是在不运行相应的停止脚本的情况下被杀死的。</div><div>如果服务因某种原因死亡,则需要自动重新启动等功能,则应考虑对适用的init系统使用适当的“本机”配置方法:</div><ul><li><div>语法DSM6.x系列中Upstart的<code>/etc/init/*</code>文件</div></li><li><div><code>/etc/systemd/system/*.service</code>文件系统在语法DSM7.x系列和更新。这些init系统具有内置的自动重新启动功能,您只需少量配置即可使用,而不必自己编写包装器脚本来查看服务流程。</div></li></ul><div><a href="https://help.synology.com/developer-guide/integrate_dsm/resource_acquisition/resource_acquisition/integrate_dsm/integrate_dsm/integrate_dsm/examples/examples/examples/publish_package/publish_package/">DSM 7语法开发指南</a></div><div><a href="https://global.download.synology.com/download/Document/Software/DeveloperGuide/Firmware/DSM/6.0/enu/DSM_Developer_Guide_6_0.pdf">DSM 6语法开发指南</a></div><div><a href="https://gist.github.com/SanCoder-Q/f3755435e6e8bd46ba95bf0ec54ae1a4">关于为DSM 6和7配置服务的可能有用的说明</a></div>

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/743237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档