【发布时间】:2015-06-27 09:29:49
【问题描述】:
作为流程自动化例程的一部分,我有一个 shell 脚本,它通过 CLI 执行多个 PHP 脚本。其中一个,当然是最后一个,非常非常长。我收到的代码库是一团糟,大部分 import.php 脚本和 ImportProduct.php 对象基本上是不可修改的。
上周我完成了将代码更新到 MySQLi 并开始测试并不断收到类似的进程终止消息。我已经挖掘了 Magento PHP 库、我自己的代码、原始代码,但找不到任何会导致它的东西。仅这种格式就让人相信是 PHP CLI 解释器、Linux 操作系统或 Apache(如果它甚至通过 Apache 运行,遗憾的是不是非常精通系统管理员)导致了终止。我 SSH 到远程服务器,但最后两行显示 SSH 本身没有超时。
通过 PHP CLI 的默认超时是没有,但是将其设置为 0 或 180 天没有区别。因此,我认为这个问题处于较低的水平。 请不要为 root 权限大喊大叫,这不是我的决定。
这是我的消息的一部分。第 5 行包含终止消息。
new_import_products.php: ET068FII.TXT: Processed 406085 records in 1686 queries.
import.php: Begin
ImportProduct.php> start 1055398
import.php: done loadFile()
./executeFullUpdateImport.sh: line 58: 4908 Killed php -f import.php
executeFullUpdateImport> full update/import completed
executeFullUpdateImport> Performed in 384m, 56s.\n\n
[root@stinedev import]#
[root@stinedev import]# ls
搜索这样的东西非常无益。谷歌返回了 90 亿页关于如何杀死进程的页面……不管我使用什么术语组合,都不能让一个进程存活(诚然,我可能问错了问题)。
【问题讨论】:
-
可能是 linux OOM 杀手 - 内存不足。我敢打赌,您的脚本会执行某种
foreach,它不会在每次迭代后清理其变量,并且它处理的项目越多,它使用的 RAM 就越多。 en.wikipedia.org/wiki/Out_of_memory -
会写入系统日志@ceejayoz 吗?
-
我会将输出转储留给客户端。现在它只是输出到 stdout/stderr。 shell 脚本本身只不过是对其他文件的一堆调用,即几个其他的 shell 脚本、jar 文件和 php 文件。根本没有变数。我在 PHP 代码中非常小心地消除了全局变量,甚至成员变量,并确保 MySQL 资源尽快释放。
-
通常情况下,OOM 会出现在系统日志中的某个地方。
-
@ceejayoz 找到它后,/var/log/messages[-date],我确实找到了一条 OOM 消息。我猜这就是我需要找到的:gist.github.com/anonymous/d667e8455adfe728e838
标签: php linux bash apache centos