【问题标题】: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 是否更可取?

【问题讨论】:

    标签: linux ssh operating-system sshd


    【解决方案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 不会丢弃现有连接
    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2023-04-03
    • 2014-02-24
    相关资源
    最近更新 更多