2013-01-14 25 views
0

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

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

现在希望能够启动它的背景和停止它时,我想通过只输入:

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

我知道该怎么做的启动脚本,但问题是如何真正停止进程?

我首先想到的东西,如检索PID:

ps aux | grep "my_service" 

然后我找到了一个更好的主意,仍然与PID:为了保存其上的文件试图停止服务时检索。

绝对太脏又不安全,我最终考虑用套接字来启用“停止”进程来告诉实际的进程关闭。

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

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

+1

大多数服务实际上将它们的pid存储在一个文件中(检查/var/run/*.pid) – Gryphius

+0

但是如果服务未正确关闭并且pid文件未被删除会怎么样? –

+0

这通常不是什么大问题,它会在下一次重新引导时被自动删除,或者在守护进程启动时被覆盖。查看相关问题http://stackoverflow.com/questions/688343/reference-for-proper-handling-of-pid-file-on-unix了解更多详情 – Gryphius

回答

1

如果您有像start-stop-daemon这样的实用程序,请使用它。

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

  • --pidfile:检查进程是否创建了文件pid文件。
  • --exec:检查是否有此可执行
  • --name的情况下,流程:检查名为进程名
  • --user流程:检查由用户名或UID指定的用户拥有的进程。

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

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

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