UNIX - 停止自定义服务

时间:2013-01-14 15:52:15

标签: unix service process daemon pid

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

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

现在希望能够在后台启动它并在我想要时通过输入来停止它:

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

我知道怎么做一个initscript,但问题是如何实际停止这个过程?

我首先考虑用以下内容检索PID:

ps aux | grep "my_service"

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

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

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

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

1 个答案:

答案 0 :(得分: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有可能匹配碰巧共享相同名称的不相关进程。如果您的服务在专用用户ID下运行,则--user可能会有用,该用户ID不会被其他用户使用。如果可以,请使用--pidfile

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

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