start-stop-daemon和使用&运行有什么区别?


18

我正在/etc/init.d中设置服务。我期待在那里各种脚本,一些与实施start-stop-daemon ...,并与一些/path/to/script &

它们全部将pid保存在文件中并进行一些检查。

最佳做法是什么,有什么区别,在这里要知道什么是重要的...?(一般来说)

在我的特殊情况下,我在Java中有一个简单的轻量级localhost http服务器,应用程序每小时大约会调用一次,它仅给出一个愚蠢的随机数(此处没有更多详细信息,我只是表示它不使用文件系统或线程或任何复杂的情况,以防在我的问题中解决)

谢谢

Answers:


27

后台作业(即以&开头)仍将其stdin,stdout和stderr连接到其启动所在的终端。它可能突然向终端写入(例如,错误消息)(“干扰”该作业)。前台)或暂停以等待键盘输入(您必须先将其放在前台)。您当然可以将stdout和stderr重定向到文件或/ dev / null,以防止background-job写入终端。

后台工作也可以放在前台-例如。当前的前台作业已停止,并且fg(foreground)命令用于将前台作业放入前台。也可以通过终端发出的信号来完成后台作业,例如。当您关闭终端时,SIGHUP通常结束(大多数)程序在终端中启动。

另一方面,守护程序(例如由init.d自动启动的守护程序,也可以从终端手动启动)在与任何终端断开连接的情况下运行。即使它是从终端手动启动的,守护程序也将与终端断开连接,因此它既不能写(stdout,stderr)也不能读(stdin)。它也可以“免疫”终端“自动”发送的信号。(尽管您可以使用来向它发送信号kill -signal pid)。

“背景”和“前景”是指进程在某些终端上的状态-无论该进程当前是否在控制终端。由于守护程序未连接到终端(但已通过各种方式与终端断开连接),因此不能说它在后台运行。守护进程只是运行而没有与终端相关联的进程-既不在后台也不在后台。

如果使用ps显示进程使用哪个终端的选项,您将看到前台和后台作业都与终端相关联(例如tty2)。另一方面,守护程序带有“?” 在这个领域里。

守护程序通常会表现为行为,即使它们是手动启动的也是如此。创建自己的守护程序需要大量工作-要完全将其与终端断开连接会涉及一些技巧。您应该创建它自己的用户/组来运行。如果要创建文件,通常必须使用/ tmp,/ var / tmp或/ var / run-通常它在其他任何地方都没有权限。由于它无法向终端报告错误,因此您应该将其写入日志文件(例如,它在/ var / log中是自己的日志文件)。守护程序应使用其当前的PID在/ var / run中进行输入,并应检查其另一个实例是否已在运行。如果适用,它应考虑文件或设备的锁(/ var / lock)。它应该通过重新加载它的配置文件并使用更新的配置来响应SIGHUP。

另一点是大多数守护程序如何工作。守护程序通常是可以在两种不同模式之一中运行的单个可执行文件。取决于是原始守护程序(父守护程序)是在启动时启动还是手动启动...还是由该父进程生成的子进程。父进程通常只是坐着等待一些事件-特定时间,经过的时间,尝试连接到特定网络端口或其他任何事件。发生这种情况时,父级会创建一个与其自身相同的子进程(使用fork()系统调用)-并立即返回以等待另一个事件(并可能产生更多的子级)。这实际上是子进程完成的工作-例如同步磁盘,运行命令(例如cron)或建立网络连接(例如sshdftpd)。父级和子级之间的唯一区别是,它们具有不同的PID,而子级的PPID(Parent-PID)是父级进程的PID-这可以用来确定进程是父级还是子级。因此,相同的过程必须能够以两种模式进行操作-作为等待(和产卵)的父母,或作为工作中的孩子。

尽管编写守护程序并不难,但也不是一件容易的事-如您所见,您首先必须知道很多“技巧”。总的来说,与其他方法相比,我认为编写守护程序需要付出很多努力才能获得很少的收益:

通常,在后台作业上使用nohupdisown做一个足够好的选择,因为即使终端关闭,它也可以使进程继续运行。将stdout和stderr重定向到文件或/ dev / null通常是个好主意。对于更具交互性的程序,这screen是在需要之前“放置”某些东西的好方法。 atbatch并且crontab还值得海外商品会有。


1
我还记得我以前的unix系统课程,当从终端启动服务器时,服务器还必须离开其[进程组] [ en.wikipedia.org/wiki/Process_group]。就目前我所记得的。这样,该过程就不会受到来自其原始终端的任何信号的干扰。
Yves Baumes 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.