Tho*_*mas 18 services daemon init.d
我正在 /etc/init.d 中设置服务。我正在查看那里的各种脚本,有些是start-stop-daemon ...用/path/to/script &.
他们都将pid保存在一个文件中并进行一些检查。
什么是最佳实践,有什么区别,在这里了解什么很重要......?(一般来说)
在我的特殊情况下,我在 Java 中有一个简单的轻量级 localhost http 服务器,应用程序每小时左右调用一次,它只是提供一个愚蠢的随机数(这里没有更多详细信息,我的意思是它不使用文件系统或线程或任何复杂的情况,以防我的问题中出现此问题)
谢谢
Baa*_*rud 27
后台作业(即以 & 开头)仍然将它的 stdin、stdout 和 stderr 连接到它启动的终端。它可能会突然向终端写入(例如错误消息)(“干扰”前台)或暂停等待键盘输入(您必须先将其置于前台)。您当然可以将 stdout 和 stderr 重定向到文件或 /dev/null 以防止后台作业写入终端。
后台作业也可以放在前台 - 例如。当前的前台作业被停止,并且fg(foreground) 命令用于将后台作业置于前台。来自终端的信号也可以到达后台作业 - 例如。关闭终端时发出 SIGHUP,这通常会结束(大多数)在终端中启动的程序。
守护进程 - 就像由 init.d 自动启动的守护进程,但也可以从终端手动启动 - 另一方面,在与任何终端断开连接的情况下运行。即使是从终端手动启动,守护进程也会与终端断开连接,因此它既不能写(stdout,stderr)也不能读(stdin)它。它也对终端“自动”发送的信号“免疫”。(尽管您可以使用 向它发送信号kill -signal pid)。
“后台”和“前台”是指进程对某个终端的状态——无论是否是当前控制终端的进程。由于守护进程未连接到终端(但已以各种方式与终端断开连接),因此不能说它在后台运行。守护进程只是在不与终端关联的情况下运行的进程——既不在前台也不在后台。
如果您使用ps显示进程使用哪个终端的选项,您将看到前台和后台作业都与终端相关联(例如 tty2)。另一方面,守护进程有一个“?” 在这个领域里。
守护进程通常是这样的,即使它们是手动启动的。创建一个你自己的守护进程是一项相当多的工作 - 需要一些技巧才能完全断开它与终端的连接。您应该创建它自己的用户/组来运行。如果您希望它创建文件,您通常必须使用 /tmp、/var/tmp 或 /var/run - 它通常不应该在其他任何地方拥有权限。由于它无法向终端报告错误,因此您应该将其写入日志文件(例如,它在 /var/log 中是自己的日志文件)。守护进程应该在 /var/run 中使用它的当前 PID 创建一个条目,并且应该检查它的另一个实例是否已经在运行。在适用的情况下,它应该尊重文件或设备的锁 (/var/lock)。它应该通过重新加载它的配置文件并使用更新的配置来响应 SIGHUP。
另一点是大多数守护进程的工作方式。守护进程通常是一个可执行文件,可以在两种不同模式中的一种下运行;取决于它是原始守护进程 - 父进程 - 是在启动时启动还是手动启动......还是由该父进程生成的子进程。父进程通常只是坐下来等待某个事件 - 特定的时间、经过的时间、尝试连接到特定的网络端口或其他任何事情。发生这种情况时,父进程会创建一个与自身相同的子进程(使用 fork() 系统调用) - 并立即返回等待另一个事件(并且可能产生更多子进程)。它是实际执行工作的子进程 - 比如同步磁盘,运行命令(例如cron)或建立网络连接(例如sshd或ftpd)。父进程和子进程之间的唯一区别是它们有不同的 PID,并且子进程的 PPID(父进程标识符)是父进程的进程标识符——这可用于确定进程是父进程还是子进程。所以同一个进程必须能够以两种模式运行——作为等待(和产卵)的父进程,或者作为一个工作的子进程。
虽然编写守护进程并不困难,但也不是微不足道的 - 正如您所看到的,您必须首先了解很多“技巧”。一般来说,与其他替代方案相比,我认为编写守护进程需要付出很多努力,但收益很小:
使用nohup或disown后台作业通常是一个足够好的选择,因为即使终端关闭,它也能让进程保持活动状态。不过,将 stdout 和 stderr 重定向到文件或 /dev/null 通常是个好主意。对于更具交互性的程序,这screen是一种将某些东西“放在一边”直到您需要它的好方法。 at,batch并且crontab还值得海外商品会有。
| 归档时间: |
|
| 查看次数: |
12004 次 |
| 最近记录: |