httpd的pid文件只包含一个ID,即使它产生了许多ID

时间:2013-10-01 16:47:53

标签: linux apache pid httpd.conf init.d

我想在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的初始化脚本?

1 个答案:

答案 0 :(得分:3)

这里有两件事:

  • 您的单个​​Apache实例可能有多个与之关联的PID,具体取决于所选MPM的类型。但是,这不应该影响您,因为您只需要终止写入PID文件的PID,并且该进程将终止所有其余的Apache实例。

  • 如果您尝试并排运行多个Apache实例,则必须指定一个不同的PID文件,每个文件一个。然后,您可以决定要杀死的实例 - 您必须处理所选的每个实例的PID文件。将相同的PID文件提供给多个实例,并期望它们各自将自己的PID放入同一个文件中,这样做无效。