为啥我会优先使用“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 ...] 不是注册实体?”

为啥我会收到使用 MPI 屏障 [c++] 的致命错误

为啥我会收到“从未使用过的参数 [E0392]”?

为啥我会收到此错误错误状态:使用 Firestore 时 DocumentSnapshotPlatform 中不存在字段?