为啥我会优先使用“service sshd reload”而不是“service sshd restart”?
Posted
技术标签:
【中文标题】为啥我会优先使用“service sshd reload”而不是“service sshd restart”?【英文标题】:Why would I use "service sshd reload" in preference to "service sshd restart"?为什么我会优先使用“service sshd reload”而不是“service sshd restart”? 【发布时间】:2013-07-09 14:40:44 【问题描述】:从我在 Linux 上的测试来看,似乎
service sshd reload
sshd
已运行时有效
如果sshd_config
文件有问题,则停止sshd
即使 sshd_config 文件有问题也返回错误代码 0
service sshd restart
sshd
是否已在运行,都可以正常工作
如果sshd_config
文件存在无效语法或其他问题,则停止sshd
如果sshd_config
文件有问题,则返回非零错误代码
我知道他们正在执行不同的操作,但在我看来,我应该始终使用 service sshd restart
。在某些情况下,service sshd reload
是否更可取?
【问题讨论】:
【参考方案1】:一些应用程序(包括多个网络服务器)支持重新加载其配置而无需重新启动。在这种情况下,reload
将是向他们发出信号的最佳方式。
作为一个用例,如果sshd
实际上确实支持重新加载配置而不影响现有连接,那就太好了。这将允许您在不丢失当前 ssh 连接的情况下验证新配置(例如,在修改权限时,以确保您仍然可以登录)。
延伸阅读:List of all systemd
unit actions
【讨论】:
但支持重新加载 _is_。我只是通过 SSH 连接完成的。【参考方案2】:我认为这个“重新加载”可以在 shell 脚本中用于多个服务恢复到初始状态,在这种情况下我们不知道服务是否正在运行,所以我们只是让所有这些服务“重新加载” ”。
如果我们在这种情况下使用“重启”,一些我们没有使用的服务将会启动。
通常调试单个服务的问题(或修改),我们希望像“sshd”这样的服务启动,“restart”应该更好,因为我们不需要检查这个服务是否运行成功。
【讨论】:
这个答案真的没有意义。问题是关于 sshd,而不是你想象中疯狂运行的随机服务。 这个问题似乎是关于“sshd”,但实际上它问的是“reload”和“restart”之间的区别,而不是“sshd”和“ssh”之间的区别,所以,正确答案是什么这个问题? 所以,这是一个关于特殊服务的问题,但答案通常可以用于任何服务。 不是真的,因为您的回答在单个服务的上下文中完全没有意义——尤其是 sshd。 “我们没有使用的一些服务?”没有—— sshd 是唯一的。 “多服务”的 Shell 脚本在问题的上下文中也没有任何意义。 问题是我们何时可以使用“重新加载”而不是“重新启动”。因此,我以“多服务”中的可能用途为例。这是我对这个问题的理解。所以我们对这个问题有不同的理解。老实说,我不明白你对这个问题的理解是什么,我的回答基于我的理解,这对你来说可能毫无意义,也许其他人可以理解。但是你对这个问题的理解是什么,你有什么答案吗?【参考方案3】:顺便提一下:如上面的例子中人们使用的是sshd,即它是守护进程,服务是ssh。正确的行应该是:
service ssh reload
【讨论】:
这完全取决于您使用的发行版。【参考方案4】:当你运行 service sshd 命令时,opt 可能会被重新加载/重新启动,它实际上会运行一个经过修改的环境的程序,就像这样:
env -i PATH="$PATH" TERM="$TERM" "$SERVICEDIR/$SERVICE" $OPTIONS
例如:
env -i PATH=/sbin:/usr/sbin:/bin:/usr/bin TERM=xterm /etc/init.d/sshd reload
sshd 命令在这两种情况下的作用几乎相同(重新启动/重新加载):
reload:尝试终止发送 HUP 信号的进程,正如您在代码片段中看到的,它需要进程的 PID 才能执行此操作。 (无论 sshd 是否已经在运行都可以工作)
reload()
echo -n $"Reloading $prog: "
if [ -n "`pidfileofproc $SSHD`" ] ; then
killproc $SSHD -HUP
else
failure $"Reloading $prog"
fi
RETVAL=$?
echo
restart:它的作用与执行 stop->start 相同。
restart()
stop
start
start()
[ -x $SSHD ] || exit 5
[ -f /etc/ssh/sshd_config ] || exit 6
# Create keys if necessary
if [ "x$AUTOCREATE_SERVER_KEYS" != xNO ]; then
do_rsa1_keygen
do_rsa_keygen
do_dsa_keygen
fi
echo -n $"Starting $prog: "
$SSHD $OPTIONS && success || failure
RETVAL=$?
[ $RETVAL -eq 0 ] && touch $lockfile
echo
return $RETVAL
stop()
echo -n $"Stopping $prog: "
if [ -n "`pidfileofproc $SSHD`" ] ; then
killproc $SSHD
else
failure $"Stopping $prog"
fi
RETVAL=$?
# if we are in halt or reboot runlevel kill all running sessions
# so the TCP connections are closed cleanly
if [ "x$runlevel" = x0 -o "x$runlevel" = x6 ] ; then
trap '' TERM
killall $prog 2>/dev/null
trap TERM
fi
[ $RETVAL -eq 0 ] && rm -f $lockfile
echo
【讨论】:
这是有用的信息,但我为什么要使用重新加载?你还说无论 sshd 是否已经运行,reload 都会起作用,但是如果 sshd 没有运行,它就不能向 sshd 发送信号。reload
不会丢弃现有连接以上是关于为啥我会优先使用“service sshd reload”而不是“service sshd restart”?的主要内容,如果未能解决你的问题,请参考以下文章
如果我不再使用它,为啥在释放 MKMapView 后我会崩溃?
为啥我会收到“类型 [class ...] 不是注册实体?”
为啥我会收到此错误错误状态:使用 Firestore 时 DocumentSnapshotPlatform 中不存在字段?