Процесс запущен, но я не могу его найти - PullRequest
0 голосов
/ 10 декабря 2010

У меня есть задача 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 ]

1 голос
/ 10 декабря 2010

htop - это команда, которая позволяет вам сортировать по деревьям, чтобы вы могли увидеть, что могло порождать процесс, и уничтожить его таким образом, если вы хотите визуально найти его.

0 голосов
/ 12 декабря 2010

Если он запускается через браузер, это будет зависеть от ваших точных настроек.

  • Ситуация , наиболее вероятно, (потому что это нормальная, самая простая настройка LAMP) заключается в том, чтовы используете Apache с mod_php;в этом случае PHP является частью процесса apache, и вам нужно будет убить процесс Apache, который его запускает.Выяснить, , что сложно и может иметь побочные эффекты.Я бы посоветовал вам вместо этого запустить задание из cron , чтобы оно всегда запускалось из командной строки, если это опция.
  • Другая возможность - вы используете какой-то fastcgi setup (менее распространенный, более сложный, но с лучшей производительностью), в этом случае ваша задача выполняется где-то в отдельном php-cgi процессе.Однако я до сих пор не уверен, как вы могли бы выяснить, какой из них выполняет вашу задачу, но, вероятно, немного безопаснее, чтобы убить их (особенно если вы скорее используете mod_fcgid чем fastcgi - он лучше справляется со смертью php-процессов).

Короче, старайтесь не запускать его из веб-браузера, если хотите убить его, не вызывая другой нестабильности.Другие ответы на этот вопрос могут позволить вам найти идентификатор процесса, но вы обнаружите, что это почти наверняка процесс apache , и вы можете или не захотите его убить.

Есливы не возражаете против нестабильности, вы можете просто перезапустить свой сервер Apache, и это убьет работу.

0 голосов
/ 10 декабря 2010

Я могу придумать пару решений:

  1. Внутри файла, который вы запускаете в фоновом режиме (/home/jason/projects/mcif/./symfony import:start-queue), который я предполагаю, является PHP-скриптом, иначе это не работает, выполните http://php.net/manual/en/function.getmypid.php и запишите pid в файл на диске. Таким образом, вы можете убить его, прочитав pid из файла.

  2. Запустить фоновый процесс, который читает (при чтении чего-либо из канала вызов exec) из именованного канала (mkfifo) для запроса от Apache (веб-сайта), который пишет в именованный канал. Фоновый процесс должен быть в ps

  3. Установите Redis и поместите его в список с Apache (веб-сайт). Из фонового процесса blpop сообщение. Снова вы сможете найти фоновый процесс в ps

0 голосов
/ 10 декабря 2010

getpid (2).Или, если вы за хаки, /proc/self.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...