UNIX-停止自定义服务

UNIX-停止自定义服务,unix,service,process,daemon,pid,Unix,Service,Process,Daemon,Pid,我创建了一个客户机-服务器应用程序,现在我想部署它 在开发过程中,我在终端上启动了服务器,当我想停止它时,我只需键入“Ctrl-C” 现在,我希望能够在后台启动它,并在需要时停止它,只需键入: /etc/init.d/my_service {stop|stop} 我知道如何执行initscript,但问题是如何实际停止该过程 我首先想到用如下方式检索PID: ps aux | grep "my_service" 然后我发现了一个更好的主意,仍然是PID:将其存储在一个文件中,以便在尝试停止服

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

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

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

/etc/init.d/my_service {stop|stop}
我知道如何执行initscript,但问题是如何实际停止该过程

我首先想到用如下方式检索PID:

ps aux | grep "my_service"
然后我发现了一个更好的主意,仍然是PID:将其存储在一个文件中,以便在尝试停止服务时检索它

肯定是太脏和不安全了,我最终考虑使用套接字启用“停止”进程来通知实际进程关闭

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


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

如果你有一个类似的实用程序,就使用它

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

  • --pid文件
    :检查进程是否创建了文件pid文件
  • --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
:如果您使用另一个实用程序或手动进行匹配,讨论同样适用。

大多数服务实际上将其pid存储在一个文件中(检查/var/run/*.pid)但是如果服务没有正确关闭,pid文件没有被删除怎么办?这通常不是什么大问题,它会在下次重新启动时自动删除,或者在守护进程启动时被覆盖。有关更多详细信息,请参阅相关问题