进程正在运行但我找不到它

时间:2010-12-10 18:17:32

标签: php linux symfony1

我有一个symfony任务,我可以使用以下命令运行:

/home/jason/projects/mcif/./symfony import:start-queue

然后我可以通过这样做看到进程正在运行:

$ ps aux | grep php
jason     5760 91.0  2.5 101628 78128 pts/0    R    13:10   0:04 php /home/jason/projects/mcif/./symfony import:process --id=593 --type=Import
jason     5775  0.0  0.0   4008   764 pts/0    S+   13:10   0:00 grep --color=auto php

这部分工作正常。现在:

  • 我有这份工作发送电子邮件,所以我知道它是否真的开始了。
  • 这项工作大约需要一个小时。
  • 如果我通过浏览器点击PHP脚本开始工作,我找不到它的过程。

这是我的剧本:

<?php exec('/home/jason/projects/mcif/./symfony import:start-queue');

如果我在命令行上运行此脚本,它可以正常工作。如果我通过浏览器运行这个脚本,我会收到脚本发送的电子邮件,所以我知道它正在运行,但是当我运行ps aux时我找不到它的进程。

我需要能够找到该过程,因为我需要能够手动杀死它。

任何想法发生了什么?

4 个答案:

答案 0 :(得分:1)

htop是一个命令,允许您按树排序,这样您就可以看到可能产生过程的内容,如果您想直观地查找它,就可以将其杀死。

答案 1 :(得分:0)

getpid(2)。或者,如果你想要黑客攻击,/proc/self

答案 2 :(得分:0)

我可以考虑几个解决方案:

  1. 你在后台(/home/jason/projects/mcif/./symfony import:start-queue开始的文件里面,我假设是PHP脚本,否则这不起作用http://php.net/manual/en/function.getmypid.php并将pid写入光盘上的文件。这样你就可以通过从文件中读取pid来杀死它。

  2. 从ap {(网站)写入命名管道的请求,从named pipe(mkfifo)开始后台进程读取(从管道中读取内容exec调用)。后台流程应位于ps

  3. 安装redis并将其从apache(网站)推送到列表中。从后台进程blpop消息。您应该能够在ps

  4. 中找到后台流程

答案 3 :(得分:0)

它通过浏览器运行,这取决于您的确切设置。

  • 最可能的情况(因为这是正常的,最简单的LAMP设置)是你正在使用Apache和mod_php;在这种情况下,PHP是 apache进程的一部分,你需要杀死正在运行它的Apache进程。找出哪个很棘手并且可能有副作用。我建议您从cron运行作业,以便它始终从命令行运行,如果这是一个选项。
  • 另一种可能性是你正在使用某种fastcgi设置(不太常见,更复杂但性能更好),在这种情况下,你的任务在某个单独的php-cgi进程中运行。我仍然不确定你怎么能弄清楚哪一个正在运行你的任务,但它可能稍微更安全地杀掉这些(特别是如果你使用mod_fcgid而不是fastcgi - 它更好地处理php进程死亡。)

因此,简而言之,如果您希望能够在不引起其他不稳定的情况下杀死它,请尽量不要在Web浏览器中运行它。这个问题的其他答案可能会让你找到进程ID,但你会发现它几乎肯定是一个 apache 进程,你可能会也可能不想杀死它。

如果你不介意不稳定,你可以重新启动你的apache服务器,它会杀死你的工作。