问题描述
我试图了解service restart [someservice]
和service reload [someservice]
之间的区别。我知道”restart”重新启动服务,而”reload”重新加载配置,但我不能理解这个的实际意义,以确定我应该在给定的上下文中使用哪个。
一个例子:我读过设置PostgreSQL的大多数指南都说,一旦我编辑了postgresql.conf和pg_hba.conf以允许远程连接,我就应该发出sudo service postgresql restart
。但是,如果我根据上面的描述猜测要使用哪个,我会选择”reload”。
如果它很重要,我在Ubuntu 11.10上 – 尽管我希望尽可能普遍适用一个解释。
最佳解决思路
您所说的是正确的,reload
告诉服务重新加载其配置文件。这意味着重新加载配置应该足够了;但是,某些服务可能“不遵循规则”或不会重新加载配置文件。因此,您可能更安全地使用restart
。我个人不使用postgresql
,所以我不知道。
次佳解决思路
-
restart =停止+开始
-
reload =保持运行+ re-read配置文件。
第三种解决思路
并非所有服务都支持reload
。对于那些那样做,通常最好重新启动(即重新加载导致更少或没有停机时间)。
The Debian Policy Manual specifies,每个/etc/init.d/
脚本应支持force-reload
操作,如果服务支持reload
,则表示reload
;如果服务不支持重新加载,则表示restart
。
我不确定这是如何转化为现代Ubuntu新贵世界的。
第四种思路
根据我对systemd的经验扩展عبد النور التومي答案。
在systemd中,每当进程启动时,它都在systemd上下文中运行,最明显的例子是在其单元文件中定义的环境变量。
因此,当您发送systemctl reload [someservice]信号时,它会向服务发送一个信号,以便在支持时正常重新加载。如果不是,该过程将简单地忽略该信号。这是可配置的。
我优雅地说什么?使用新配置或代码启动新工作人员,并在他们完成当前请求(如果有)时停止旧工作人员。
如果您创建systemctl restart [someservice]
,它将告诉systemctl告诉服务停止,销毁当前systemd上下文,创建一个新服务并再次运行该服务。例如,在系统上下文中重新加载环境变量或者不支持重新加载时,这是有意义的。
希望这澄清一点,如果我错了,请告诉我。