【问题标题】:httpd's pid file only contains one ID even though it spawned manyhttpd 的 pid 文件只包含一个 ID,即使它产生了很多
【发布时间】:2013-10-07 22:31:33
【问题描述】:

我想在一个 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

...为什么会这样?当以后有其他 httpds 时,很难杀死我的 dev httpd procs。不能永远使用'killall'...

$ httpd -v
Server version: Apache/2.2.24 (Unix)

我应该注意到 CentOS 6.4 最小版没有安装 killproc,所以我将我的 init.d 更改为使用

kill -9 `cat ${pidfile}`

相反。我猜 killproc 会搜索出子 PID 吗?所以我必须安装python来安装killproc只是为了使用httpd的init脚本?

【问题讨论】:

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


    【解决方案1】:

    这里有两件事:

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

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

    【讨论】:

    • re: 1,我不认为这是真的,因为我做了sudo kill -9 18279 然后ps -A | grep httpd 仍然显示所有其他人。我是否使用了错误的 MPM?回复:2,我在我的问题中并没有那么充实,但这就是我所说的“自然......”位的意思;这就是为什么它被称为httpd-dev.pid 和其他人将有不同的名字(一旦我得到这个能够重新启动......)
    • 好吧,也许那是因为 kill -9 不是停止 Apache 的正确方法……对于真正的多线程 MPM,即使 kill -9 也应该可以正常工作。对于分叉 MPM,分叉的孩子很可能不会立即(或永远)注意到他们的父母的死亡,显然父母不能向其孩子发送退出信号。据我所知,Apache 中没有任何规定可以获取子代的 PID 以用于分叉 MPM。此外,如果您运行任何 CGI 或任何从 Apache 派生的东西(例如:启动外部程序的 PHP 脚本),这些进程根本不由 Apache 管理。
    • 啊!我敢打赌我接管了那个配置,因为分叉是你可以在 win32 上使用的唯一一个。我会尝试切换到真正的多线程。谢谢!
    • 哦,等等,MPM 已经编译进去了。我的这里是在 CentOS 上使用 'prefork' 完成的。但这是 unix 的默认设置......所以......我有点困惑。 kill -9 不正确,但我确定依赖于 python 的未声明依赖 killproc 也不正确?所以默认情况下您通常无法干净地重新启动httpd?那为什么还要麻烦有一个 init.d 脚本呢?
    • 您对 PID 文件中的 PID 使用 kill -TERM,它应该终止。实际上, apachectl -k stop 应该做类似的事情。
    猜你喜欢
    • 2012-11-02
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 2020-02-09
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多