0

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

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

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

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

我知道如何做一个初始化脚本,但问题是如何真正停止这个过程?

我首先想到的是使用以下内容检索 PID:

ps aux | grep "my_service"

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

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

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

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

4

1 回答 1

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,如果可以,请使用。

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

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

于 2013-01-14T16:17:16.477 回答