我想在CentOS盒子上运行多个httpd服务,这样如果我正在开发一个mod_perl脚本并需要重新启动其中一个,其他的可以独立运行。我在Windows上进行了此设置并正在迁移。
当然这意味着单独的PID文件。我在httpd.conf中使用PidFile指令配置我的,并将init.d脚本指向同一个地方。它可以创建文件,但不会使用所有PID填充它:
$ sudo killall httpd ; sudo service httpd-dev restart
Stopping httpd: cat: /var/run/httpd/httpd-dev.pid: No such file or directory
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Starting httpd: [ OK ]
$ sudo cat /var/run/httpd/httpd-dev.pid
18279
$ ps -A | grep httpd
18279 ? 00:00:00 httpd
18282 ? 00:00:00 httpd
18283 ? 00:00:00 httpd
18284 ? 00:00:00 httpd
18285 ? 00:00:00 httpd
18286 ? 00:00:00 httpd
18287 ? 00:00:00 httpd
18288 ? 00:00:00 httpd
18289 ? 00:00:00 httpd
......为什么会这样?稍后当有其他httpd时,很难杀死我的dev httpd procs。不能永远使用'killall'......
$ httpd -v
Server version: Apache/2.2.24 (Unix)
我应该注意CentOS 6.4 minimal没有安装killproc
,所以我把init.d改为使用
kill -9 `cat ${pidfile}`
代替。我猜killproc会搜索出子PID吗?所以我必须安装python来安装killproc只是为了使用httpd的初始化脚本?
答案 0 :(得分:3)
这里有两件事:
您的单个Apache实例可能有多个与之关联的PID,具体取决于所选MPM的类型。但是,这不应该影响您,因为您只需要终止写入PID文件的PID,并且该进程将终止所有其余的Apache实例。
如果您尝试并排运行多个Apache实例,则必须指定一个不同的PID文件,每个文件一个。然后,您可以决定要杀死的实例 - 您必须处理所选的每个实例的PID文件。将相同的PID文件提供给多个实例,并期望它们各自将自己的PID放入同一个文件中,这样做无效。