为什么我会使用"service sshd reload"优先于"service sshd restart"?

Tim*_*lis 8 linux ssh operating-system sshd

从我在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

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

    env -i PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" ${OPTIONS}
Run Code Online (Sandbox Code Playgroud)

例如:

    env -i PATH=/sbin:/usr/sbin:/bin:/usr/bin TERM=xterm /etc/init.d/sshd reload
Run Code Online (Sandbox Code Playgroud)

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
    }
Run Code Online (Sandbox Code Playgroud)

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
    }
Run Code Online (Sandbox Code Playgroud)