【问题标题】:UNIX - Stopping a custom serviceUNIX - 停止自定义服务
【发布时间】:2012-12-28 14:42:16
【问题描述】:

我创建了一个客户端-服务器应用程序,现在我想部署它。

在开发过程中,我在终端上启动了服务器,当我想停止它时,我只需要输入“Ctrl-C”。

现在希望能够在后台启动它并在我想要的时候停止它,只需键入:

/etc/init.d/my_service {stop|stop}

我知道如何执行初始化脚本,但问题是如何真正停止进程?

我首先想到的是用类似这样的方式检索 PID:

ps aux | grep "my_service"

然后我找到了一个更好的主意,仍然使用 PID:将其存储在文件中以便在尝试停止服务时检索它。

确实太脏和不安全,我最终想到了使用套接字来启用“停止”进程来告诉实际进程关闭。

我想知道这通常是怎么做的?或者更确切地说,最好的方法是什么?

我检查了 init.d 中的一些文件,其中一些使用 PID 文件,但使用了一个特定的命令“start-stop-daemon”。我有点怀疑这种对我来说似乎不安全的方法。

【问题讨论】:

  • 大多数服务实际上将它们的 pid 存储在一个文件中(检查 /var/run/*.pid )
  • 但是如果服务没有正确关闭并且pid文件没有被删除怎么办?
  • 这通常不是什么大问题,它会在下次重新启动时自动删除或在守护进程启动时被覆盖。查看相关问题stackoverflow.com/questions/688343/…了解更多详情

标签: unix service process daemon pid


【解决方案1】:

如果您有类似start-stop-daemon 的实用程序可用,请使用它。

start-stop-daemon 很灵活,可以使用 4 种不同的方法来查找正在运行的服务的进程 ID。它使用此信息 (1) 避免在启动时启动同一服务的第二个副本,以及 (2) 确定在停止服务时要终止哪个进程 ID。

  • --pidfile:检查进程是否创建了文件pid-file。
  • --exec:检查作为此可执行文件实例的进程
  • --name: 检查名称为 process-name 的进程
  • --user:检查由用户名或 uid 指定的用户拥有的进程。

一般来说最好用的可能是--pidfile。其他的主要用于服务不创建 PID 文件的情况。 --exec 的缺点是您无法区分由同一程序实现的两个不同服务(即同一服务的两个副本)。这个缺点通常也适用于--name,此外,--name 有机会匹配碰巧共享相同名称的不相关进程。 --user 如果您的服务在专用用户 ID 下运行,则可能很有用,该用户 ID 不被其他任何人使用。因此,如果可以,请使用--pidfile

为了更加安全,可以组合这些选项。例如,您可以同时使用--pidfile--exec。这样,您可以使用 PID 文件识别进程,但如果在 PID 文件中找到的 PID 属于使用错误可执行文件(它是陈旧/无效的 PID 文件)的进程,则不要相信它。

我已使用start-stop-daemon 提供的选项名称来讨论不同的可能性,但您不必使用start-stop-daemon:如果您使用其他实用程序或手动进行匹配,该讨论同样适用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2019-07-27
    • 1970-01-01
    相关资源
    最近更新 更多