⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 basics-daemons.html

📁 FreeBSD操作系统的详细使用手册
💻 HTML
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta name="generator" content="HTML Tidy, see www.w3.org" /><title>守护进程,信号和杀死进程</title><meta name="GENERATOR" content="Modular DocBook HTML Stylesheet Version 1.7" /><link rel="HOME" title="FreeBSD 使用手册" href="index.html" /><link rel="UP" title="UNIX 基础" href="basics.html" /><link rel="PREVIOUS" title="进程" href="basics-processes.html" /><link rel="NEXT" title="Shells" href="shells.html" /><link rel="STYLESHEET" type="text/css" href="docbook.css" /><meta http-equiv="Content-Type" content="text/html; charset=GB2312" /></head><body class="SECT1" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#840084"alink="#0000FF"><div class="NAVHEADER"><table summary="Header navigation table" width="100%" border="0" cellpadding="0"cellspacing="0"><tr><th colspan="3" align="center">FreeBSD 使用手册</th></tr><tr><td width="10%" align="left" valign="bottom"><a href="basics-processes.html"accesskey="P">后退</a></td><td width="80%" align="center" valign="bottom">章 3. UNIX 基础</td><td width="10%" align="right" valign="bottom"><a href="shells.html"accesskey="N">前进</a></td></tr></table><hr align="LEFT" width="100%" /></div><div class="SECT1"><h1 class="SECT1"><a id="BASICS-DAEMONS" name="BASICS-DAEMONS">3.8.守护进程,信号和杀死进程</a></h1><p>当你运行一个编辑器时它是很容易控制的,告诉它去加载文件它就加载。你之所以能这样做,是因为编辑器提供这样便利去这样做,和因为有编辑器去附上的<iclass="FIRSTTERM">终端</i>。一些程序在运行中不需要连续的用户输入,一有机会就从终端里分离到后台去。例如,一个web系统整天都在作web请求的响应,他不需要你输入任何东西就能完成,这个类别的另一个例子就是把email的传送。</p><p>我们把那些程序叫<i class="FIRSTTERM">守护进程</i>。守护神是希腊神话中的一些人物,非正非邪,他们是些守护小幽灵,大体上为人类作出贡献。许多类似web系统或mail系统的系统对于今天仍有用途,这就是为什么在那么长的时间里,BSD的吉祥物保持为一双鞋加一把钢叉的守护神模样。</p><p>守护进程的程序命名通常在最后加一个``d''。 <bclass="APPLICATION">BIND</b>是伯克莱互联网络守护进程命名(and the actual program thatexecutes is called <tt class="COMMAND">named</tt>), <bclass="APPLICATION">Apache</b>web系统的程序就叫<tt class="COMMAND">httpd</tt>,在行式打印机上的打印守护进程就是<tt class="COMMAND">lpd</tt>。这只是一种惯例,不是标准或硬性规定。 例如,为<bclass="APPLICATION">Sendmail</b>而应用的主要mail守护进程就叫<ttclass="COMMAND">sendmail</tt>, 却不叫<ttclass="COMMAND">maild</tt>,这和你推测的一样。</p><p>有时你必须和一个守护进程的程序通信,这些通信就叫<i class="FIRSTTERM">信号</i>。你能发送一个信号给守护进程(或有关的另一些运行进程)与它进行通信,各个不同的信号各自就是一个数字编号,而你所发送的--数字编号各自有一个特殊的含义。有些人把信号解悉为'请求',并在'请求'的文档里告诉你怎样把信号理解为请求。你只能给所属于你的进程发信号,假如你给其他人的进程发信号, 进程就会用<spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">kill</span>(1)</span> 或 <spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">kill</span>(2)</span>权限进行拒绝。当然,<tt class="USERNAME">root</tt> 用户会例外,它能把各种信号发送给每个进程。</p><p>在某些案例里,FreeBSD也会向应用软件发送信号。假如一个应用软件含有恶意写入并试图去访问内存,那是不可想象的,FreeBSD会向那个进程发送 <iclass="FIRSTTERM">段式违规</i> 信号 (<var class="LITERAL">SIGSEGV</var>)。假如一个应用软件使用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">alarm</span>(3)</span>系统去进行周期性调用闹钟功能,每当达到时间时,FreeBSD会向应用软件发送闹钟信号(<var class="LITERAL">SIGALRM</var>)。</p><p>有两个信号可以停止进程:<var class="LITERAL">SIGTERM</var> 和 <varclass="LITERAL">SIGKILL</var>。 <var class="LITERAL">SIGTERM</var>比较友好,进程能<spanclass="emphasis"><i class="EMPHASIS">捕捉</i></span>这个信号,根据你的需要来关闭程序。在关闭程序之前,你可以结束打开的记录文件和完成正在做的任务。在一些案例里,假如进程正在进行作业而且不能中断,那么进程可以忽略这个<varclass="LITERAL">SIGTERM</var>信号。</p><p>对于<var class="LITERAL">SIGKILL</var>信号,进程是不能忽略的。 这是一个'``我不管你在做什么,立刻停止'''的信号。 假如你发送<varclass="LITERAL">SIGKILL</var>信号给进程, FreeBSD就将进程停止在那里。<a id="AEN4708"name="AEN4708" href="#FTN.AEN4708"><span class="footnote">[1]</span></a>.</p><p>你可能会去使用 <var class="LITERAL">SIGHUP</var>、 <var class="LITERAL">SIGUSR1</var>和 <var class="LITERAL">SIGUSR2</var>信号。 这都是些通用的信号,各种应用程序都可以应用在各方面的信号发送。</p><p>假如你改变了web系统的配置文件--并想web系统去重读它的配置, 你可以停止然后再启动<ttclass="COMMAND">httpd</tt>。但这样做web系统会导致一个短暂的中断周期,那样是不受欢迎的。几乎所有的守护进程在编写时,都会指定对<varclass="LITERAL">SIGHUP</var> 信号进行响应从而重读配置文件。所以最好的方法就是不去杀死并重启<tt class="COMMAND">httpd</tt>,而是发一个<varclass="LITERAL">SIGHUP</var>信号给他。因为在这方面没有一个标准,不同的守护进程有不同的用法,所以不了解时应读一下守护进程的文档。</p><p>发送信号可用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">kill</span>(1)</span> 命令, 请参考<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">kill</span>(1)</span>所列出的例子。</p><div class="PROCEDURE"><p><b>发送一个信号给进程</b></p><p>这个例子显示了怎样去发一个信号给<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">inetd</span>(8)</span>。 <ttclass="COMMAND">inetd</tt>配置文件是<tt class="FILENAME">/etc/inetd.conf</tt>, 如果想<ttclass="COMMAND">inetd</tt> 去重读文件系统的话,可以给它发一个<varclass="LITERAL">SIGHUP</var> 信号。</p><ol type="1"><li><p>寻找你要发送信号的进程ID,可以用<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ps</span>(1)</span> 加 <span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">grep</span>(1)</span>来完成。 <span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">grep</span>(1)</span>命令被用在搜索输出方面,搜索你指定的字符串。这命令是由普通用户来执行的,而<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">inetd</span>(8)</span>是<tt class="USERNAME">root</tt>用户运行的,所以必须给<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ps</span>(1)</span>带上<var class="OPTION">ax</var>选项。</p><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">ps -ax | grep inetd</kbd>  198  ??  IWs    0:00.00 inetd -wW</pre><p>得出 <span class="CITEREFENTRY"><span class="REFENTRYTITLE">inetd</span>(8)</span>PID号是198。 有时 <var class="LITERAL">grep inetd</var> 命令也出现在输出中,这是因为在这方面 <span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">ps</span>(1)</span> 也是寻找列表中运行进程。</p></li><li><p>使用 <span class="CITEREFENTRY"><span class="REFENTRYTITLE">kill</span>(1)</span>去发送信号。 因为 <span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">inetd</span>(8)</span> 是由 <tt class="USERNAME">root</tt>启动的,你必须使用 <span class="CITEREFENTRY"><span class="REFENTRYTITLE">su</span>(1)</span> 去变为 <tt class="USERNAME">root</tt> 用户。</p><pre class="SCREEN"><samp class="PROMPT">%</samp> <kbd class="USERINPUT">su</kbd><samp class="PROMPT">Password:</samp><samp class="PROMPT">#</samp> <kbd class="USERINPUT">/bin/kill -s HUP 198</kbd></pre><p>和大多数 <span class="TRADEMARK">UNIX</span>&reg; 命令一样, <spanclass="CITEREFENTRY"><span class="REFENTRYTITLE">kill</span>(1)</span>完成任务之是没有内容输出的。 假如你发送信号给一个不属于你的进程, 你会看到 ``<ttclass="ERRORNAME">kill: <var class="REPLACEABLE">PID</var>: Operation notpermitted</tt>''. 假如输错了PID号,把信号发送到其他进程,那是坏事。或者你侥幸,把信号发送到不存在的进程, 你会看见 ``<tt class="ERRORNAME">kill: <varclass="REPLACEABLE">PID</var>: No such process</tt>''.</p><div class="NOTE"><blockquote class="NOTE"><p><b>为什么使用 <tt class="COMMAND">/bin/kill</tt>?:</b> 许多shell提供了内建<ttclass="COMMAND">kill</tt>命令, 这样, shell就能直接发送信号,而不是运行 <ttclass="FILENAME">/bin/kill</tt>。 这点非常有用,但不同shell有不同的语法来指定发送信号的名字, 与其试图把它们学完倒不如简单地直接使用 <ttclass="COMMAND">/bin/kill <var class="REPLACEABLE">...</var></tt>。</p></blockquote></div></li></ol></div><p>发送其他的信号也很相似,只要在命令行替换<var class="LITERAL">TERM</var>或<varclass="LITERAL">KILL</var>就行了。</p><div class="IMPORTANT"><blockquote class="IMPORTANT"><p><b>重要:</b> 在系统上随意杀死进程是个坏主意,特别是<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">init</span>(8)</span>,它的进程ID是1,它非常特殊。假果想你的系统快速玩完的话,可以运行<tt class="COMMAND">/bin/kill -s KILL 1</tt>命令。当你按下<b class="KEYCAP">Return</b>键时,<span class="emphasis"><iclass="EMPHASIS">始终</i></span>必须 去详细检查你所运行的<span class="CITEREFENTRY"><spanclass="REFENTRYTITLE">kill</span>(1)</span>。</p></blockquote></div></div><h3 class="FOOTNOTES">注</h3><table border="0" class="FOOTNOTES" width="100%"><tr><td align="LEFT" valign="TOP" width="5%"><a id="FTN.AEN4708" name="FTN.AEN4708"href="basics-daemons.html#AEN4708"><span class="footnote">[1]</span></a></td><td align="LEFT" valign="TOP" width="95%"><p>有点不正确--少数的东西是不能中断的。例如,假如进程试图从网络上另一个计算机的一个文件读取,而那个的计算机会因为某些原因拿走了这个文件,那这个进程从上术情况来看是``不能中断''。最终这个进程会超时,典型的两分钟。一出现超时进程将被杀死。</p></td></tr></table><div class="NAVFOOTER"><hr align="LEFT" width="100%" /><table summary="Footer navigation table" width="100%" border="0" cellpadding="0"cellspacing="0"><tr><td width="33%" align="left" valign="top"><a href="basics-processes.html"accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html"accesskey="H">起点</a></td><td width="33%" align="right" valign="top"><a href="shells.html"accesskey="N">前进</a></td></tr><tr><td width="33%" align="left" valign="top">进程</td><td width="34%" align="center" valign="top"><a href="basics.html"accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">Shells</td></tr></table></div></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -