PHP脚本在没有解释的情况下被终止

PHP脚本在没有解释的情况下被终止,php,bash,putty,Php,Bash,Putty,我将以以下方式启动我的php脚本: bash cd 'path' php -f 'scriptname'.php php脚本运行时没有输出 过了一段时间后,php脚本响应为: Killed 我的想法是它达到了内存限制:ini\u集('memory\u limit','40960M') 增加内存限制似乎可以解决问题,但只会增加边缘 “Killed”这个短语的确切含义是什么?如果您已经在处理与脚本内存和超时相关的php.ini设置,那么可能是它的linux ssh连接在活动会话或类似

我将以以下方式启动我的php脚本:

bash  
cd 'path'   
php -f 'scriptname'.php
php脚本运行时没有输出

过了一段时间后,php脚本响应为:

Killed 
我的想法是它达到了内存限制:
ini\u集('memory\u limit','40960M')

增加内存限制似乎可以解决问题,但只会增加边缘


“Killed”这个短语的确切含义是什么?

如果您已经在处理与脚本内存和超时相关的php.ini设置,那么可能是它的linux ssh连接在活动会话或类似的事情中终止

您可以使用'nohup'linux命令运行不受挂起影响的命令

shell> nohup php -f 'scriptname'.php
编辑:-您可以通过在命令末尾添加“&”来关闭会话:-

shell> nohup php -f 'scriptname'.php &> /dev/null &
“&”运算符在任何COM的末尾,在linux中在后台移动该命令

在命令之前尝试使用nohup

nohup捕捉到挂断信号,而符号没有捕捉到(除非外壳以这种方式配置或根本不发送SIGHUP)

通常,当使用&运行命令并随后退出shell时,shell将使用挂起信号(kill-SIGHUP)终止子命令。使用nohup可以防止这种情况,因为它捕获信号并忽略它,因此它永远不会到达实际应用程序

在使用bash的情况下,可以使用shopt | grep hupon命令来确定shell是否向其子进程发送SIGHUP。如果它处于关闭状态,进程将不会终止,就像您的情况一样

有些情况下nohup不起作用,例如,当您启动的进程重新连接nohup信号时

nohup php -f 'yourscript'.php

kill
是bash在SIGKILL之后退出进程时所说的,它与putty无关

Terminated
是bash在SIGTERM之后退出进程时所说的

您没有遇到,可能遇到了其他问题,请参阅:


您的进程被终止。可能有很多原因,但很容易放弃一些更明显的原因

  • php限制:如果遇到php限制,日志文件中会出现错误,命令行中也可能会出现错误。这通常不会打印“已终止”
  • 会话结束问题:如果您仍然有会话,那么您的会话显然没有结束,因此忽略所有nohup和
    &
    内容
如果您的服务器缺少资源(没有内存,没有交换),内核可能会终止您的进程。这可能就是正在发生的事情

在任何情况下:您的进程正在收到一个信号,它应该停止。通常只有几件事能做到这一点

  • 您的帐户(例如,您终止了进程)
  • 管理员用户(例如root用户)
  • 当内核本身确实需要内存时,它会自动启动
  • 例如,如果您生活在一个共享服务器上,并且占用的资源超过了您的共享资源,那么可能需要一些自动化流程

参考资料:

PHP脚本中的内存可能已用完。下面是如何重现该错误:

我正在使用PHP 5.3.10在Ubuntu 12.10上执行此示例:

创建名为
m.PHP
的PHP脚本并保存它:

<?php
    function repeat(){
       repeat();
    }
    repeat();
?>
程序占用100%的CPU约15秒,然后停止。看看
dmesg | grep php
,有一些线索:

el@apollo:~/foo$ dmesg | grep php
[2387779.707894] Out of memory: Kill process 2114 (php) score 868 or 
sacrifice child
在我的例子中,PHP程序打印“Killed”并停止,因为它由于无限循环而耗尽了内存

解决方案:

  • 增加可用RAM的数量
  • 将问题集分解成更小的块,按顺序操作
  • 重写程序,使其具有更小的内存需求
    putty会话及其所有运行进程在shell结束时终止。在commandJust术语之前使用
    nohup
    ,但为了更好地理解:putty正是允许您向服务器打开
    SSH
    会话的工具。这是真的不太可能的腻子是杀死你的过程。您正处于会话中,某些事情会扼杀您的进程。你可以在会话中看到它(putty完成会话)。看到所有的nohup答案:你的会话仍然正常运行吗?你能在看到“被杀”后做一个“ls”吗?如果是这样的话,这些答案可能对你没有帮助…@bansi,有趣的是,我真的尝试过,即使我没有关闭会话,但没有成功…@Nanne是的,我知道它只将我与我们的服务器连接,但服务器上没有任何东西,只要我知道,它可能会杀死我的进程…假设会话仍然运行(你确实看到了‘kill’),我看不出有什么理由要挂断?我想说的是,你没有遇到php的限制,因为你会看到一个错误,而不是一个sigkill!@Nanne facepalm。我真的应该更仔细地阅读我自己的答案,修正了thx!@spuratic先生,我想检查一下,有WIFSIGNALED()和WTERMSIG()的php版本吗?或者shallI让它们在哪里运行?这些只在父进程中用于查看子进程发生了什么。也就是说,查看PHP的函数。可能也很有用。我认为PHP不必查找接收信号的详细信息。PHP是否有任何函数可以检查当前的交换使用情况,或者有任何bash cmd可以实时检查mush交换是如何使用的?当然。登录运行时分开(或者在后台运行命令,使用
    top
    free
    等命令检查服务器状态,尽管完全运行可能超出了此问题的范围。尝试查找手册页。我在哪里可以看到交换使用情况?我只看到内存使用情况。sry…忘记那个问题我有点盲目XD有人应该补充一点,即设置set_time_limit()的时间很难确定,因为它不会在php终端中显示任何“Killed”,这与内存限制行为不同
    el@apollo:~/foo$ dmesg | grep php
    [2387779.707894] Out of memory: Kill process 2114 (php) score 868 or 
    sacrifice child