2013-04-30 8 views
0

Есть ли надежный способ, с помощью которого скрипт php cli может определить, работает ли другой скрипт php cli? Запустив в этом случае, я имею в виду, что он вернет строку для себя, если я сделал ps aux | grep scriptname.php в командной строке.Может ли один скрипт PHP cli обнаруживать, работает ли еще один скрипт PHP cli?

Эта команда также имеет тенденцию возвращаться на выходе, поэтому я беспокоюсь, что если я просто сделаю exec('ps aux | grep scriptname.php',$output);, он вернет ложный положительный результат.

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

+1

Почему бы не использовать файл блокировки для обнаружения нескольких вызовов? – Barmar

+0

Я никогда не знаю, стоит ли решать вопрос или основную проблему. В этом случае я ответил на вопрос в своем ответе, но я предпочел предложение Бармара использовать файл блокировки. – leftclickben

+0

@Barmar Это не проблема с несколькими вызовами, хотя файл блокировки может работать. В этом случае, я думаю, ответ от ответа leftclickben может оказаться для меня менее эффективным ... :) – AntonChanning

ответ

2

Вот несколько проще вариант ответа leftclickben годов. Обертка одной буквы в имени сценария с [] экономит вам от необходимости отфильтровать grep.

exec('ps aux | grep "[s]criptname.php"', $output); 
+0

Уверены ли вы в этом? Я просто попробовал (в командной строке, а не в PHP), 'echo" foo bar "| grep bar', а затем 'echo" foo bar "| grep "[b] ar" и попал в обоих случаях. Или я чего-то не хватает? – leftclickben

+0

@leftclickben Этот трюк имеет значение только для grepping вывода ps. Запустите свой скрипт, а затем сравните 'ps aux | grep scriptname.php' с 'ps aux | grep "[s] criptname.php". – Barmar

+1

* facepalm * Конечно - это делает так, что команда 'ps' фактически не содержит« scriptname.php », а другая строка с квадратными скобками. Я чему-то научился - спасибо :-) Первый комментарий к этому сообщению имеет более полное объяснение: http://askubuntu.com/questions/153419/how-does-this-tricky-bracket-expression-in-grep-work – leftclickben

1

Вы можете использовать grep -v grep, чтобы отфильтровать часть «возврат себя в выходной». То есть, это будет только найти scriptname.php где нет и в команде grep:

exec('ps aux | grep scriptname.php | grep -v grep', $output); 
+0

Отфильтровывает 'grep', но не отфильтровывает экземпляр проверяемого скрипта. – Barmar

+0

Итак, вы просто ищете две строки вместо одного ... Если есть один, то он работает только один, если есть два, то есть еще один. – leftclickben

+0

@Barmar Сценарий, который проверяется, называется чем-то другим, поэтому он не должен обнаруживать себя в этом случае. Это хороший момент, если кто-то хочет определить, работает ли тот же скрипт ... – AntonChanning

Смежные вопросы