Answers:
后台作业(即以&开头)仍将其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
)或建立网络连接(例如sshd
或ftpd
)。父级和子级之间的唯一区别是,它们具有不同的PID,而子级的PPID(Parent-PID)是父级进程的PID-这可以用来确定进程是父级还是子级。因此,相同的过程必须能够以两种模式进行操作-作为等待(和产卵)的父母,或作为工作中的孩子。
尽管编写守护程序并不难,但也不是一件容易的事-如您所见,您首先必须知道很多“技巧”。总的来说,与其他方法相比,我认为编写守护程序需要付出很多努力才能获得很少的收益:
通常,在后台作业上使用nohup
或disown
做一个足够好的选择,因为即使终端关闭,它也可以使进程继续运行。将stdout和stderr重定向到文件或/ dev / null通常是个好主意。对于更具交互性的程序,这screen
是在需要之前“放置”某些东西的好方法。 at
,batch
并且crontab
还值得海外商品会有。