apache停上或重启的有两种,第一种发送信号到进程,第二种是使用apachectl脚本执行stop,start,graceful或graceful-stop命令
信号方式:
1.TERM
kill -TERM `cat /usr/local/apache2/logs/httpd.pid` #类似 apachectl -k stop
原理过程: 当发送 TERM或stop信号时,父进程会试图立即杀死子进程,但杀死子进程可能需要几秒钟,过程中父进程退出,所有已经在处理的请求都会终止,并且不在接受其他请求
2.USR1
kill -USR1 `cat /usr/local/apache2/logs/httpd.pid` #类似 apachectl -k granceful
原理过程:当发送USR1或者graceful信号时,子进程会先处理已经接受的请求,然后再退出(如果子进程没有提供服务则立即退出),父进程不会退出,它会重新加载配置文件和重新打开日志文件,每一个子进程死后,父进程会用生成新的子进程然后重新处理请求
3.HUP
kill -HUP `cat /usr/local/apache2/logs/httpd.pid` #类似 apachectl -k restart
原理过程:当发送HUP或者restart信号时,父进程会像发送TERM信号一样杀死子进程,但是父进程不会退出,它会重新打开配置文件和重新打开日志文件,然后产生一组新的子进程来提供服务
4.WINCH
kill -WINCH `cat /usr/local/apache2/logs/httpd.pid` #类似apachectl -k granceful-stop
原理过程:当发送WINCH或者graceful-stop信号时,父进程会建议子进程待处理请求完后再退出(如果子进程没有在提供服务 则立即退出),之后父进程将会移除原来创建的的pidfile文件停止所有正在监听的端口,此过程父进程继续运行,并且监听正在处理的请求的子进程,一旦子进程处理完成或者超过了这个GracefulShutdownTimeout
指定的处理时间,父进程也退出。如果超过了GracefulShutdownTimeout
这个时间,将发送一个TERM信号,迫使正在处理请求的子进程退出。
在这个过程中父进程移除了pidfile文件,将无法使用apachectl或httpd发送此信号。
granceful-stop允许同时运行多个相同配置的httpd实例,在对httpd进行优雅的升级时,这是一个强大的特性,但是它也会导致一些配置的死锁和竞争资源
为了确保磁盘上包含了pid的文件(如锁文件)或Unix套接字文件(ScriptSock)不受影响,它们应该在没有问题的情况下共存,实则系统已经采取了谨慎的措施。但是如果配置了指令、第三方模块或持久的CGI,并且使用磁盘锁或状态文件,那么应该注意确保多个httpd实例不会阻塞彼此的文件。