当您运行一个编辑器时它是很容易控制的,告诉它去加载文件它就加载。您之所以能这样做,是因为编辑器提供这样便利去这样做,和因为有编辑器去附上的终端。一些程序在运行中不需要连续的用户输入,一有机会就从终端里分离到后台去。例如,一个web系统整天都在作web请求的响应,他不需要您输入任何东西就能完成,这个类别的另一个例子就是把email的传送。
我们把那些程序叫守护进程。守护神是希腊神话中的一些人物,非正非邪,他们是些守护小幽灵,大体上为人类作出贡献。许多类似web系统或mail系统的系统对于今天仍有用途,这就是为什么在那么长的时间里,bsd的吉祥物保持为一双鞋加一把钢叉的守护神模样。
守护进程的程序命名通常在最后加一个“d”。 bind是伯克莱互联网络守护进程命名(and the actual program that executes is called named), apacheweb系统的程序就叫httpd,在行式打印机上的打印守护进程就是lpd。这只是一种惯例,不是标准或硬性规定。 例如,为sendmail而应用的主要mail守护进程就叫sendmail, 却不叫maild,这和您推测的一样。
有时您必须和一个守护进程的程序通信,这些通信就叫信号。您能发送一个信号给守护进程(或有关的另一些运行进程)与它进行通信,各个不同的信号各自就是一个数字编号,而您所发送的--数字编号各自有一个特殊的含义。有些人把信号解悉为'请求',并在'请求'的文档里告诉您怎样把信号理解为请求。您只能给所属于您的进程发信号,假如您给其他人的进程发信号, 进程就会用kill(1) 或 kill(2)权限进行拒绝。当然,root 用户会例外,它能把各种信号发送给每个进程。
在某些案例里,freebsd也会向应用软件发送信号。假如一个应用软件含有恶意写入并试图去访问内存,那是不可想象的,freebsd会向那个进程发送 段式违规 信号 (sigsegv)。假如一个应用软件使用alarm(3)系统去进行周期性调用闹钟功能,每当达到时间时, freebsd会向应用软件发送闹钟信号(sigalrm)。
有两个信号可以停止进程:sigterm 和 sigkill。 sigterm比较友好,进程能捕捉这个信号,根据您的需要来关闭程序。在关闭程序之前,您可以结束打开的记录文件和完成正在做的任务。在一些案例里,假如进程正在进行作业而且不能中断,那么进程可以忽略这个sigterm信号。
对于sigkill信号,进程是不能忽略的。 这是一个 '“我不管您在做什么,立刻停止”'的信号。 假如您发送sigkill信号给进程, freebsd就将进程停止在那里。[1].
您可能会去使用 sighup、 sigusr1 和 sigusr2信号。 这都是些通用的信号,各种应用程序都可以应用在各方面的信号发送。
假如您改变了web系统的配置文件--并想web系统去重读它的配置, 您可以停止然后再启动httpd。但这样做web系统会导致一个短暂的中断周期,那样是不受欢迎的。几乎所有的守护进程在编写时,都会指定对sighup 信号进行响应从而重读配置文件。所以最好的方法就是不去杀死并重启httpd,而是发一个sighup信号给他。因为在这方面没有一个标准,不同的守护进程有不同的用法,所以不了解时应读一下守护进程的文档。
发送信号可用kill(1) 命令, 请参考kill(1)所列出的例子。
发送一个信号给进程
这个例子显示了怎样去发一个信号给.netd(8)。 .netd配置文件是/etc/.netd.conf, 如果想.netd 去重读文件系统的话,可以给它发一个sighup 信号。
寻找您要发送信号的进程id,可以用ps(1) 加 grep(1)来完成。 grep(1)命令被用在搜索输出方面,搜索您指定的字符串。这命令是由普通用户来执行的,而.netd(8)是root用户运行的,所以必须给ps(1)带上ax选项。
% ps -ax grep .netd
198 ?? iws 0:00.00 .netd -ww
得出 .netd(8) pid号是198。 有时 grep .netd 命令也出现在输出中,这是因为在这方面 ps(1) 也是寻找列表中运行进程。
使用 kill(1) 去发送信号。 因为 .netd(8) 是由 root启动的,您必须使用 su(1) 去变为 root 用户。
% su
password:
# /bin/kill -s hup 198
和大多数 unix? 命令一样, kill(1) 完成任务之是没有内容输出的。 假如您发送信号给一个不属于您的进程, 您会看到 ``kill: pid: operation not permitted''. 假如输错了pid号,把信号发送到其他进程,那是坏事。或者您侥幸,把信号发送到不存在的进程, 您会看见 ``kill: pid: no such process''.
为什么使用 /bin/kill?: 许多shell提供了内建kill命令, 这样, shell就能直接发送信号,而不是运行 /bin/kill。 这点非常有用,但不同shell有不同的语法来指定发送信号的名字, 与其试图把它们学完倒不如简单地直接使用 /bin/kill ...。
发送其他的信号也很相似,只要在命令行替换term或kill就行了。
important: 在系统上随意杀死进程是个坏主意,特别是init(8),它的进程id是1,它非常特殊。 可以运行 /bin/kill -s kill 1 命令来让系统迅速关机。 当您按下 return 键时, 始终 必须 去详细检查您所运行的 kill(1)。
notes
[1] 有点不正确--少数的东西是不能中断的。例如,假如进程试图从网络上另一个计算机的一个文件读取,而那个的计算机会因为某些原因拿走了这个文件,那这个进程从上术情况来看是“不能中断”。最终这个进程会超时,典型的两分钟。一出现超时进程将被杀死。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器