我创建了一个客户端 - 服务器应用程序,现在我想部署它。
在开发过程中,我在终端上启动了服务器,当我想要停止它时,我只需要输入“Ctrl-C”。
现在希望能够在后台启动它并在我想要时通过输入来停止它:
/etc/init.d/my_service {stop|stop}
我知道怎么做一个initscript,但问题是如何实际停止这个过程?
我首先考虑用以下内容检索PID:
ps aux | grep "my_service"
然后我发现了一个更好的想法,仍然使用PID:将其存储在文件中,以便在尝试停止服务时检索它。
绝对太脏和不安全,我最终想到使用套接字启用“停止”过程来告诉实际进程关闭。
我想知道这通常是怎么做的?或者更确切地说,最好的方法是什么?
我检查了init.d中的一些文件,其中一些文件使用PID文件,但使用了特定的命令“start-stop-daemon”。我对这种看起来不安全的方法有点怀疑。
答案 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
:如果您使用其他实用程序或手动进行匹配,讨论也适用。