8

从我在 Linux 上的测试来看,似乎

service sshd reload

  • 仅在sshd已经运行时才有效
  • sshd如果sshd_config文件有问题则停止
  • 即使 sshd_config 文件有问题,也返回错误代码 0

service sshd restart

  • 无论是否sshd已经运行都可以工作
  • sshd如果sshd_config文件有无效的语法或其他问题,则停止
  • sshd_config如果文件有问题,则返回非零错误代码

我知道他们正在执行不同的操作,但在我看来,我应该始终使用service sshd restart. 有什么理由service sshd reload在某些情况下更可取吗?

4

4 回答 4

4

当您运行可以重新加载/重新启动opt的service sshd命令时,它实际上会运行一个具有修改后环境的程序,如下所示:

    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
    }
于 2013-08-30T20:16:42.267 回答
1

一些应用程序,包括几个 Web 服务器,支持在根本不重新启动的情况下重新加载其配置。在这种情况下,reload这是向他们发出信号的最佳方式。

sshd作为一个用例,如果确实支持重新加载配置而不影响现有连接,那就太好了。这将允许在不丢失当前 ssh 连接的情况下验证新配置(例如,在修改权限时,以确保您仍然可以登录)。

延伸阅读:所有systemd单元动作列表

于 2016-08-11T16:54:34.690 回答
0

顺便提一下:在上面的例子中人们使用sshd,它是守护进程,服务是ssh。正确的行应该是:

service ssh reload
于 2014-12-17T12:54:56.310 回答
-1

我认为这个“重新加载”可以在 shell 脚本中用于多个服务恢复到初始状态,在这种情况下,我们不知道服务是否正在运行,所以我们只是让所有这些服务“重新加载”。

如果我们在这种情况下使用“重启”,一些我们没有使用的服务将会启动。

通常对于单个服务的调试问题(或修改),我们希望像“sshd”这样的服务启动,“重启”应该更好,因为我们不需要检查这个服务是否运行成功。

于 2016-08-02T20:06:46.737 回答