要停止或者重启apache,必须向正在运行的httpd进程发送信号。有两种方式:

    1.使用Unix系统的kill命令

     只要向父进程(在PidFile中可以找到该进程的pid)发送终止信号即可。有四个信号可以发送,分别是:TERM、USR1、HUP、WINCH。

     命令示例:

 


kill -TERM `cat /usr/local/apache2/logs/httpd.pid`


    2.使用-k命令通知httpd进程

      命令参数有:stoprestartgracefulgraceful-stop

 


httpd -k start


   官方推荐使用apachectl控制脚本。

 


apachectl -k stop


 

向httpd发送完信号后,可使用如下命令查询进度:


tail -f /usr/local/apache2/logs/error_log


 

  • 立即停止(Stop Now

    Signal: TERM


apachectl -k stop


   向父进程发送TERM或者stop信号,父进程立即尝试杀掉所有子进程,这个过程可能需要持续几秒,之后父进程自行退出。所有该进程的请求终止。

  • Graceful Restart

     Signal: USR1

 


apachectl -k graceful

 

   父进程收到USR1 或者 graceful 信号后,通知子进程在处理完当前请求后退出(如果没有请求立即退出),父进程重读配置文件并重新打开日志,当子进程死掉后,父进程使用新生成的子进程替换它,这样新子进程可以立即向请求提供服务。 

    代码设计为总是遵守MPMs的进程控制指令,因此在重启过程中,为客户端服务的进程和线程数总是维护在一个合适的水平(适合当前负载和参数设置)。

    代码设计为既能尽量较少不能提供服务的时间也能遵守你的调节参数。

    status module使用G标识这些在graceful restart之前启动的仍在提供服务的子进程。

    目前,对于循环日志脚本,还没有办法确切知道所有子进程是否结束对重启前的日志的写操作。建议延迟一段时间再对原日志进行操作。

 

    如果配置文件有错误,父进程不会重启,而是因错误退出,而子进程仍然会运行到处理完最后一个请求。这样会导致当你试图重启服务器时,它不能绑定到监听端口。

   解决办法之一,可以在重启前使用-t命令进行语法检查。

  • 立即重启(Restart Now

      Signal: HUP

 


apachectl -k restart


   向父进程发送HUP或者restart信号,它会杀死所有子进程,但是父进程本身不退出,它重读配置文件并重新打开日志文件,然后重新生成子进程集继续提供服务。

 

  • 优雅停止(Graceful Stop )

    Signal: WINCH


apachectl -k graceful-stop


 向父进程发送WINCH 或者graceful-stop 信号,父进程首先通知子进程在处理完当前请求后退出(无请求立即退出),然后父进程移除PidFile并且停止监听端口。父进程会持续运行并监控处理请求的子进程,一旦所有子进程停止或者到达GracefulShutdownTimeout规定的时间,父进程退出。到达超时时间,剩余的子进程将会被发送TERM信号强制退出。