我注意到用类似的方法重新启动服务:
service sshd restart
与执行以下操作非常相似:
pkill -HUP sshd
但是 pkill 会关闭我的 ssh 会话,而服务重新启动会使它保持打开状态。这引出了我的问题,即服务重新启动是否会像 pkill 命令一样发送真正的 HUP?如果他们做了同样的事情,为什么服务重新启动会让我的 ssh 会话保持打开状态,但 pkill 会关闭它?
答案1
不SIGHUP
,可能并不像你想象的那样。
在过去(我这里说的是 20 世纪 70 年代),终端是一种通过串行线路连接到 UNIX 机器的设备。这通常是通过调制解调器连接来完成的,因为在当时,购买第二台机器比支付大量电话连接费用要昂贵得多;通过使用调制解调器线路,您可以与远方的人共享一台机器。
当你使用完机器后,非常有必要确保你正在运行的任何东西都会停止,因为当时的机器没有今天的机器所拥有的相同数量的资源,因此系统会帮助你确保当调制解调器挂断时,您没有忘记通过向连接到串行线路的任何进程发送信号来执行此操作。这就是“挂断”信号,其名称缩写为SIGHUP
。
在某些时候,有人发现让进程连续运行有时是有意义的,以便为计算机上的用户提供一些服务。为了确保进程确实继续运行,有必要将其从启动它的终端中分离出来,这样当用户断开连接并且调制解调器挂断时,该进程就不会继续运行。被杀了。此外,如果进程不与串行线分离,则终端将不会被释放,并且下一个尝试使用它的用户将无法这样做。因此,出于这些原因,你会分离。
现在您有一个长时间运行的流程,在某些时候可能需要重新配置。您可以重新启动它,或者让进程经常轮询其配置文件。然而,两者都浪费资源。如果您能告诉它何时重新读取其配置文件,那就更好了。既然这个信号对于守护进程来说是毫无意义的,为什么不重用它呢?是的,这就是发生的事情,结果今天的约定确实是守护进程在收到SIGHUP
.
但这只是一个惯例,绝不是一般规则。主要且已记录的目的SIGHUP
仍然是表明终端连接已被切断。因此,任何程序在收到信号后的默认操作SIGHUP
仍然是终止,即使该进程是守护进程。
因此,一个init
实现不能只需发送SIGHUP
到它管理的随机进程。是的,在许多情况下,重新加载操作最终会SIGHUP
通过 init 系统具有的任何配置(例如 init 脚本、systemd 单元文件、upstart 配置或其他配置)发送到守护进程;但这是不正确的认为这总是会发生的事情,因此说两者是等价的也是不正确的。
有时,这也解释了为什么发送SIGHUP
到sshd
终端的命令会终止会话;这是因为 sshd 假设某些东西终止了连接,因此它必须终止。
答案2
从sshd(8)
:
specified in the configuration file. sshd rereads its configuration file
when it receives a hangup signal, SIGHUP, by executing itself with the
pkill -HUP sshd
服务脚本和不加区分的as之间的区别root
在于,服务脚本仅针对主sshd
进程,而服务脚本pkill
将获取该进程以及sshd
已从该父进程派生的任何子进程。例子:
% ps axo pid,ppid,command | grep ssh'[d]'
1808 1 /usr/sbin/sshd
8066 1808 sshd: jdoe [priv] (sshd)
28968 8066 sshd: jdoe@ttypj (sshd)
%
init(8)
(pid 1) 已启动主进程sshd
(pid 1808),并且有两个子sshd
进程可供登录者使用(pid 8066 和 28968)。pkill
发送到所有这些,而服务脚本只会发送HUP
到 pid 1808。
答案3
这是非常特定于服务的(所以我的回答忽略了您特别提到的sshd
服务)
许多服务都会触发重新加载当收到 时SIGHUP
,但他们也可能忽略该信号或终止。
奥托将军服务重启(有时一个服务重新加载) 主要包括完全关闭服务器并重新启动它(因此它通常是 的快捷方式service $SERVICE stop; service $SERVICE start
)。
最后,调用service $SERVICE reload
(或任何其他服务命令)将在幕后调用一个专门的脚本,该脚本具有先验知识关于要操作的服务:因此,如果相关服务想要SIGHUP
重新加载,脚本将发送此信号;但可能会触发其他动作来达到重新加载的效果)
答案4
假设这是关于upstart
,那么,不,不是,至少在我的系统上不是。
service
是一个 shell 脚本,initctl
您可以通过查看来检查 运行情况which service
。
restart
映射到stop
+ exec start
。
stop
发送SIGTERM
,并且可能SIGKILL
如果SIGTERM
在合理的时间内没有工作(至少手册上是这么说的)。
reload
如果你想发送SIGHUP
一个新贵服务,这就是你想要的。