Mysql php cli脚本挂起,没有消息

Mysql php cli脚本挂起,没有消息,mysql,linux,php,Mysql,Linux,Php,我编写了一个通过SSH和nohup运行的PHP脚本,用于处理数据库中的记录并对其进行处理(例如,处理一些图像,更新一些行) 它适用于小负载,高达10k的记录。我有一些更大的数据集,可以处理大约40k条记录(我意识到这并不多,但当每条记录需要下载和处理多达50张图像时,这会增加很多工作) 处理较大的数据集可能需要几天时间。有时我会在调试日志中看到内存错误,这已经足够清楚了——但有时脚本在我身上似乎“死”了或变成僵尸。调试日志的尾部刚刚停止,没有错误消息,nohup日志的尾部没有错误,进程仍然显示在

我编写了一个通过SSH和nohup运行的PHP脚本,用于处理数据库中的记录并对其进行处理(例如,处理一些图像,更新一些行)

它适用于小负载,高达10k的记录。我有一些更大的数据集,可以处理大约40k条记录(我意识到这并不多,但当每条记录需要下载和处理多达50张图像时,这会增加很多工作)

处理较大的数据集可能需要几天时间。有时我会在调试日志中看到内存错误,这已经足够清楚了——但有时脚本在我身上似乎“死”了或变成僵尸。调试日志的尾部刚刚停止,没有错误消息,nohup日志的尾部没有错误,进程仍然显示在ps列表中,如下所示--
26075 pts/0 S 745:01/usr/bin/php./import.php
但是没有工作要做

有人能告诉我为什么一个进程会退出吗?据我所知,显而易见的事情(比如php脚本超时和内存问题)并不是一个因素

谢谢你的提示

PS——这是托管在godaddy VDS上的(不是我的选择)。我有点怀疑godaddy有某种限制,尽管我在代码中做了什么重写(比如设置时间限制(0)),但它可能会影响我。如果你真的,真的,真的想远离它,作为根,让你的进程把
-17
写到
/proc/self/oom\u adj
注意:内核通常更清楚。避开OOM杀手实际上会破坏您试图查询的同一个RDBMS。这将是多么恶性循环:)

您可能(相反)希望根据从
/proc/loadavg
/proc/meminfo
读取的内容错开查询。如果以指数方式增加负载或交换,则需要后退,尤其是作为后台进程:)

此外,在运行时进行监视。与系统启动时间相比,这可以从
/proc/stat
中取平均值。在你开始和进步的时候记下它

不幸的是,被称为OOM killer的串行killer没有维护除了解析内核消息之外还可以访问的正文计数

或者,您的cron作业不断达到其
ulimit
ed分配堆的数量。无论哪种方式,你的工作都需要在适当的时候退后,或者在做任何工作之前防止自己的消亡(如上所述)


作为补充说明,您可能不应该像在共享主机上那样做。如果有那么大,是时候建立一个VPS(至少)了,这样你就可以控制进程做什么。

(1)你不能把进程分成更小的块吗?(2) 为什么要用nohup而不是screen?嗯,它一次运行500条记录。我确信有其他的策略来分担负载,但这似乎是合理的,只是很耗时。初始导入后,记录更新要小得多,而且非常易于管理。我读过关于screen的书,但我对它没有经验——使用screen有什么好处?谢谢,还有“strace”可以查看它是否挂在系统调用上,或者挂在php@Marc-可能,但不太可能。”“PHP内部”将导致磁盘休眠或传递的一些错误。要么是显而易见的。@Marc-要么只是一个僵尸。谢谢你们!Tim,作为一个简单的PHP黑客,我恐怕有点难以理解——这是在一个虚拟服务器上运行的,只有mysql和这个脚本在运行。这绝对不是我的选择,我在一对AmazonEC2机器上开发了它(一台用作服务器,一台用作mysql服务器),没有任何问题!如果可能的话,您能否提供更多关于使用IOWAIT和loadavg来限制PHP脚本的方法的信息?谢谢