<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Alex Volkov &#187; Linux</title>
	<atom:link href="http://alexvolkov.ru/category/linux/feed" rel="self" type="application/rss+xml" />
	<link>http://alexvolkov.ru</link>
	<description>cat /var/log/life.log &#124; grep -E &#34;life&#124;work&#124;etc&#34;</description>
	<lastBuildDate>Wed, 22 Feb 2012 17:00:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Профилирование и отладка PHP скриптов</title>
		<link>http://alexvolkov.ru/php-debugging-and-profiling.html</link>
		<comments>http://alexvolkov.ru/php-debugging-and-profiling.html#comments</comments>
		<pubDate>Thu, 09 Feb 2012 14:28:19 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Скрипты]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[profiling]]></category>
		<category><![CDATA[xdebug]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1998</guid>
		<description><![CDATA[Отладка скриптов вообще дело крайне нужное и полезное. Кроме основной задачи &#8212; поиска и удаления ошибок, отладка прямо улучшает качество и работоспособность программы в целом. Выловленные баги, исправленная логика &#8212; все это делает программу стабильнее в работе, что весьма желанная цель при ее написании. Все ниженаписанное основывается на моем опыте, так что воспринимайте это как [...]]]></description>
			<content:encoded><![CDATA[<p>Отладка скриптов вообще дело крайне нужное и полезное. Кроме основной задачи &#8212; поиска и удаления ошибок, отладка прямо улучшает качество и работоспособность программы в целом. Выловленные баги, исправленная логика &#8212; все это делает программу стабильнее в работе, что весьма желанная цель при ее написании. Все ниженаписанное основывается на моем опыте, так что воспринимайте это как мое имхо ))</p>
<p><em>Если жмакнуть одну из этих кнопочек, то увидеть скрытый контент!</em></p>
<p><a href="http://twitter.com/share"  class="twitter-share-button" data-counturl="http://alexvolkov.ru/php-debugging-and-profiling.html"  data-url="http://alexvolkov.ru/php-debugging-and-profiling.html"  data-count="horizontal" >Tweet</a> <span style="display:inline-block; width:100px;"></span> <g:plusone callback="display_like_content" href="http://alexvolkov.ru/php-debugging-and-profiling.html"></g:plusone><div id='google_after_like' style='display:none;clear:both;width:100%;;'>Тут особо ничего интересного нет, я просто хотел потестить один плуг для вп, который обещает huge traffic waves.

Так что сорри за облом ожиданий и спасибо кнопку! :))</div><span id="more-1998"></span></p>
<p>Итак, какие бывают ошибки и как их можно отловить.</p>
<p>1. Самые простые и самые распространённые &#8212; это ошибки, связанные с чудным свойством php &#8212; динамической типизацией. Помимо того, что иногда просто упускаешь из виду, что там и в каком формате у тебя хранится, php сам подкидывает сюрпризы вида true при сравнении &#171;qwerty&#187; == 0 и другие чудеса автоматического приведения типов и подобные им брейнфаки.</p>
<p>Если точно известно место, где переменная перестает себя вести, как от нее ожидают, то я особо не мудрствую и ставлю var_dump(переменная). Если догадка подтверждается, то исправляем косяк и идем дальше.</p>
<p>Но не всегда получается определить точное место расхождения значения с ожидаемым. Расхождение это может быть зарыто глубоко в дебри кода, либо наоборот, находится на самом видном месте.</p>
<p>Так же бывает, что переменная меняет значение из-за нарушенной логики приложения. Например, присвоение идет внутри локальной видимости вложенной функции или неверно построенного цикла. Наружу передается не тот результат, который ждешь, хотя с виду все правильно. Просто не там открыл или закрыл скобку и все изменяется причудливым образом.</p>
<p>Такую красоту довольно трудно отловить руками, особенно в крупных приложениях. Поэтому лучше воспользоваться дебаггером. Во всяких умных книжках довольно часто пишут про <a href="http://pecl.php.net/package/apd">APD</a>, хвалят его, но дата его последнего релиза за 2004 год как-то меня настораживает. В багтрекере пишут, что под 5.3 не хочет он работать, у меня из груши не встал, поэтому я забил на него.</p>
<p>Трассировку скрипта можно сделать xdebug&#8217;ом. Он часто бывает установлен, но как модуль PHP, а для нормальной работы нужно, чтобы он стоял как Zend module.  По установке все итак расписано в нете, не буду повторяться.</p>
<p>Xdebug генерирует отчет, который показвает последовательно, кто, куда, зачем обратился. Есть специальные парсилки логов, но мне удобнее читать сырые отчеты, потому как в консоли особо красоту не получишь, а через веб я не умею отлаживать. Выдается вот такая красота:</p>
<pre class="brush:plain">3	67	0	0.013521	394468	drXdebugTraceFileParser-&gt;parseLine	1		/home/alex/tmp/trace.php	123	1	$line = '2\t3\t1\t0.000772\t328656\n'
4	68	0	0.013588	394584	explode	0		/home/alex/tmp/trace.php	149	2	'\t'	'2\t3\t1\t0.000772\t328656\n'
4	68	1	0.013630	395376
4	69	0	0.013666	395348	count	0		/home/alex/tmp/trace.php	150	1	array (0 =&gt; '2', 1 =&gt; '3', 2 =&gt; '1', 3 =&gt; '0.000772', 4 =&gt; '328656\n')
4	69	1	0.013716	395348
4	70	0	0.013757	395436	array_pop	0		/home/alex/tmp/trace.php	178	1	array (0 =&gt; '{main}', 1 =&gt; 'ini_set')
4	70	1	0.013800	395408
4	71	0	0.013823	395332	drXdebugTraceFileParser-&gt;addToFunction	1		/home/alex/tmp/trace.php	180	5	$function = 'ini_set'	$time = 4.3E-5	$memory = 236	$nestedTime = 0	$nestedMemory = 0
5	72	0	0.013900	395376	in_array	0		/home/alex/tmp/trace.php	194</pre>
<p>&nbsp;</p>
<p>Этого достаточно, чтобы проследить логику хода выполнения и отследить косяки. Забыл еще сказать, что xdebug можно подключать на лету. Обычно я выключаю и дебаггер и профайлер в php.ini, а в нужном скрипте просто включаю их вместе или по очереди через</p>
<pre class="brush:php">ini_set('xdebug.default_enable', 1);
ini_set('xdebug.profiler_enable', 1);</pre>
<p>Это быстро, не нужно никаких дополнительных телодвижений. Xdebug еще можно подключать на кучу разных IDE, даже вроде в денвере он есть.Таким нехитрым образом можно отловить большинство ошибок и невнимательностей в коде. Естественно, что изначально задуманную кривую логику так не исправить.</p>
<p>2. Второй тип ошибок гораздо сложнее отловить. Они также появляются вследствии зевков и невнимательностей, но проявляют себя не сразу, а по наступлению определенных условий. Например, время работы или количество итераций или появление определенного числа в арифметических операциях или наоборот, его непоявление.Еще ошибки могут возникать из-за изменений среды окружения, например форк апача завершил свою сессию и скинул скрипт или крон запускает что-то, что отъело всю память и скрипт просто не может запуститься.</p>
<p>Таких условий может быть множество, всех их обьеденяет одна черта &#8212; они не проявляются сразу при запуске, поэтому при анализе лога дебаггера ничего подозрительного выявить нельзя.</p>
<p>Тут приходит на помощь замечательная утилита &#8212; strace. Я одно время мучился с тем, что апач раз в 24 часа убивал свои потоки, а с ними и скрипты, из-под которых они были запущены. Так вот был настроен сервер. Нашли ошибку, когда подключились с другого терминала непосредственно к скрипту и слушали его через strace. Там и увидели, что скрипт ловит SIGTERM. <a href="http://alexvolkov.ru/examples-of-using-strace-to-debug-scripts.html">Как использовать strace</a> я уже писал. Позволяет исследовать реальную работу скрипта в реальном времени и видит все, что с ним происходит. Вывод можно перенаправить в файл и потом проанализировать. Еще есть схожая утилита, называет ptrace. Все они родные для nix систем. <a href="http://habrahabr.ru/blogs/php/129982/">Некоторые чуваки с хабры</a> используют для схожих целей сишный дебаггер. Кому в чем удобней&#8230;</p>
<p>3. Третий тип ошибок заключается в том, что память начинает резко утекать куда-то и нужно выяснить куда. Они также возникают из-за невнимательности или усталости и получаются чудеса типа файл инклюдится в бесконечном цикле или переменная набирает и набирает обьемиз-за того, что ее не обнулили предварительно.  Все это конечно можно отловить и через strace, но лучше использовать для этого профайлер xdebug&#8217;а.</p>
<p>Также этот способ следует использовать в целях профилактики, чтобы держать под контролем количество вызовов, открытий файлов и размеров переменных. Сам xdebug конечно не отдает все в удобноваримом виде, но под чтение его отчетов есть куча утилит. Я пользуюсь<a href="http://derickrethans.nl/xdebug-and-tracing-memory-usage.html"> этим скриптом</a>. Он выдает отчеты вида</p>
<pre class="brush:plain">function            #calls time memory time memory
------------------------------------------------------------
ini_set                  3 0.0002      584 0.0002      584
fix_string               1 0.0010      264 0.0009      184
xdebug_call_file         1 0.0001       48 0.0001       48
xdebug_call_function     1 0.0000       32 0.0000       32
var_dump                 1 0.0002        0 0.0002        0
xdebug_memory_usage      1 0.0000        0 0.0000        0
xdebug_call_line         1 0.0000        0 0.0000        0
{main}                   1 0.0018      480 0.0003     -368</pre>
<p>Здесь уже можно отследить и вызовы  и время. Запускаю его обычно в конце работы, чтобы посмотреть, не напортачил ли я чего в коде. Также использую его при оптимизации для оценки результатов</p>
<p>Вот такие нехитрые способы, надеюсь, помогут спасти время и нервы при отладке скриптов. Если есть у кого свои методики &#8212; велкам в коменты, буду рад услышать.</p>
<p>P.S. Если кто знает, как завести APD под 5.3, отпишитесь плз!</p>
<p>P.P.S <a href="https://www.progclub.org/blog/2012/01/10/profiling-a-php-script/">Тут вот чувак просто тру-самурай</a>, целый квест прошел чтобы найти ошибку. Шрифт жесть.</p>
<p>Там строку 967 в файле php_apd.c надо закоментить и все заработает.</p>
<p>И чтобы сделать читалку логов, надо скомпиленную pprofp скопировать в /usr/bin и создать ссылку на php в /usr/local/bin/</p>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li><a href="http://alexvolkov.ru/problems-with-the-serialization-of-arrays.html" title="Проблемы с сериализацией массивов">Проблемы с сериализацией массивов</a></li><li><a href="http://alexvolkov.ru/class-to-work-with-the-service-reduction-options.html" title="Класс для работы с сервисами сокращения ссылок">Класс для работы с сервисами сокращения ссылок</a></li><li><a href="http://alexvolkov.ru/a-simple-way-to-test-the-process-on-the-existence-of.html" title="Простой способ проверки процесса на существование">Простой способ проверки процесса на существование</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/php-debugging-and-profiling.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Вложенные SQL запросы: одновременное добавление одинарных и множественных строк в INSERT</title>
		<link>http://alexvolkov.ru/embedded-sql-statements-the-simultaneous-addition-of-single-and-multiple-rows-in-the-insert.html</link>
		<comments>http://alexvolkov.ru/embedded-sql-statements-the-simultaneous-addition-of-single-and-multiple-rows-in-the-insert.html#comments</comments>
		<pubDate>Tue, 04 Oct 2011 09:11:12 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Скрипты]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[nested queries]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1892</guid>
		<description><![CDATA[Понадобилось для одной задачи сделать выборку из таблицы А по определенным условиям и вставить ее в таблицу B. Можно особо не заморачиваться, сделать SELECT  в переменную, потом пройтись циклом по INSERT и все. Но это не очень красивое решение. Очень запросов много + на переменные память расходуется. Проще использовать вложенные запросы, они же nested queries. [...]]]></description>
			<content:encoded><![CDATA[<p>Понадобилось для одной задачи сделать выборку из таблицы А по определенным условиям и вставить ее в таблицу B.<br />
Можно особо не заморачиваться, сделать SELECT  в переменную, потом пройтись циклом по INSERT и все.</p>
<p>Но это не очень красивое решение. Очень запросов много + на переменные память расходуется. Проще использовать вложенные запросы, они же nested queries. Но тут возникает проблемка -  если вставлять  только данные из INSERT, то все ок, но если добавлять еще и какие-нибудь неизменные значения, то выдается <em>Subquery returned more than 1 value.<br />
</em><br />
Чтобы не обьяснять на пальцах &#8212; сама таблица B</p>
<pre class="brush:sql">CREATE TEMPORARY TABLE `B` (
  `status` TINYINT(4) NULL DEFAULT NULL ,
  `pair` TEXT NULL DEFAULT NULL ,
)
ENGINE = MyISAM
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;</pre>
<p>Копируем из таблицы A и вставляем в B так</p>
<pre class="brush:sql">INSERT INTO `B` (`pair`)
            SELECT `pair` FROM `A` ORDER BY RAND() LIMIT 100;</pre>
<p>Если поле status имеет неизменное значение, например 123, то просто вот так уже не вставить</p>
<pre class="brush:sql">INSERT INTO `B` (`status`, `pair`) VALUES (
            (SELECT `pair` FROM `A` ORDER BY RAND() LIMIT 100),
            123);</pre>
<p>Не совсем красивое решение нашел</p>
<pre class="brush:sql">UPDATE `B` SET `status` = '123' WHERE 1=1;</pre>
<p>Но хотелось бы в одну строку все заделать. Отпишитесь плиз в коментах, кто знает, как реализовать.</p>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li><a href="http://alexvolkov.ru/the-script-for-tuning-mysql.html" title="Скрипт для тюнинга MYSQL">Скрипт для тюнинга MYSQL</a></li><li><a href="http://alexvolkov.ru/mysql-rand-how-to-get-a-random-line-from-db.html" title="MYSQL RAND(), как получить рандомную строку из БД">MYSQL RAND(), как получить рандомную строку из БД</a></li><li><a href="http://alexvolkov.ru/robkijj-tar.html" title="Робкий tar )">Робкий tar )</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/embedded-sql-statements-the-simultaneous-addition-of-single-and-multiple-rows-in-the-insert.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Считаем, сколько строк кода в php проекте.</title>
		<link>http://alexvolkov.ru/consider-how-many-lines-of-code-in-a-php-project.html</link>
		<comments>http://alexvolkov.ru/consider-how-many-lines-of-code-in-a-php-project.html#comments</comments>
		<pubDate>Tue, 17 May 2011 22:34:05 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1876</guid>
		<description><![CDATA[Упало в ридер несколько записей(раз, двас, трис), как посчитать строчки в си проектах и стало интересно, сколько же строчек я накропал для одного проекта. Оказалось, 5060, не считая js и css всяких. Сама команда: find . -type f -name "*.php" -exec wc -l {} +; На закуску.Простой способ проверки процесса на существованиеКак узнать статус процесса [...]]]></description>
			<content:encoded><![CDATA[<p>Упало в ридер несколько записей(<a href="http://www.commandlinefu.com/commands/view/8394/how-many-lines-in-your-c-project">раз</a>, <a href="http://www.commandlinefu.com/commands/view/8399/how-many-lines-in-your-c-project">двас</a>, <a href="http://www.commandlinefu.com/commands/view/8397/how-many-lines-in-your-c-project">трис</a>), как посчитать строчки в си проектах и стало интересно, сколько же строчек я накропал для одного проекта. Оказалось, 5060, не считая js и css всяких.</p>
<p>Сама команда:</p>
<pre class="brush:shell">find . -type f -name "*.php" -exec wc -l {} +;</pre>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li><a href="http://alexvolkov.ru/a-simple-way-to-test-the-process-on-the-existence-of.html" title="Простой способ проверки процесса на существование">Простой способ проверки процесса на существование</a></li><li><a href="http://alexvolkov.ru/kak-uznat-status-processa-po-pid.html" title="Как узнать статус процесса по pid">Как узнать статус процесса по pid</a></li><li><a href="http://alexvolkov.ru/organizaciya-bekapa-na-serverakh.html" title="Организация бекапа на серверах">Организация бекапа на серверах</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/consider-how-many-lines-of-code-in-a-php-project.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Скрипт для тюнинга MYSQL</title>
		<link>http://alexvolkov.ru/the-script-for-tuning-mysql.html</link>
		<comments>http://alexvolkov.ru/the-script-for-tuning-mysql.html#comments</comments>
		<pubDate>Tue, 29 Mar 2011 19:54:50 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1874</guid>
		<description><![CDATA[Знакомый кинул линк на перловый скриптец, который собирает статистику из конфига и логов и выдает рекомендации по оптимизации бд. Вот такой вывод: -------- General Statistics -------------------------------------------------- [--] Skipped version check for MySQLTuner script [OK] Currently running supported MySQL version 5.0.51a-24+lenny5-log [!!] Switch to 64-bit OS - MySQL cannot currently use all of your RAM -------- [...]]]></description>
			<content:encoded><![CDATA[<p>Знакомый кинул линк на перловый скриптец, который собирает статистику из конфига и логов и выдает рекомендации по оптимизации бд.<br />
Вот такой вывод:</p>
<pre class="brush:shell">-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.51a-24+lenny5-log
[!!] Switch to 64-bit OS - MySQL cannot currently use all of your RAM

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +Archive -BDB +Federated -InnoDB -ISAM -NDBCluster 

[--] Data in MyISAM tables: 5M (Tables: 260)
[OK] Total fragmented tables: 0

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 1d 12h 14m 59s (4M q [33.837 qps], 39K conn, TX: 822M, RX: 460M)
[--] Reads / Writes: 30% / 70%
[--] Total buffers: 57.0M global + 50.5M per thread
(400 max threads)
[!!] Allocating &gt; 2GB RAM on 32-bit systems can cause system instability
[!!] Maximum possible memory usage: 19.8G (293%
of installed RAM)
[!!] Slow queries: 10%
(443K/4M)
[OK] Highest usage of available connections: 38%
(152/400)
[OK] Key buffer size / total MyISAM indexes:
15.0M/4.7M
[OK] Key buffer hit rate: 99.1% (9M cached
/ 91K reads)
[OK] Query cache efficiency: 75.5% (2M cached /
2M selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp
sorts / 439K sorts)
[OK] Temporary tables created on disk: 1% (8K
on disk / 444K total)
[OK] Thread cache hit rate: 99% (307 created /
39K connections)
[!!] Table cache hit rate: 0% (5 open /
11K opened)
[OK] Open file limit used: 0%
(11/65K)
[OK] Table locks acquired immediately: 99%
(2M immediate / 2M
locks)

-------- Recommendations -----------------------------------------------------
General recommendations:
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
  *** MySQL's maximum memory usage is dangerously high ***
  *** Add RAM before increasing MySQL buffer variables ***
    table_cache (&gt; 32562)</pre>
<p>Сам скрипт лежит тут: <a href="https://github.com/rackerhacker/MySQLTuner-perl">веб</a>, <a href="git://github.com/rackerhacker/MySQLTuner-perl.git">гит</a></p>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li><a href="http://alexvolkov.ru/embedded-sql-statements-the-simultaneous-addition-of-single-and-multiple-rows-in-the-insert.html" title="Вложенные SQL запросы: одновременное добавление одинарных и множественных строк в INSERT">Вложенные SQL запросы: одновременное добавление одинарных и множественных строк в INSERT</a></li><li><a href="http://alexvolkov.ru/mysql-rand-how-to-get-a-random-line-from-db.html" title="MYSQL RAND(), как получить рандомную строку из БД">MYSQL RAND(), как получить рандомную строку из БД</a></li><li><a href="http://alexvolkov.ru/robkijj-tar.html" title="Робкий tar )">Робкий tar )</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/the-script-for-tuning-mysql.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Простой способ проверки процесса на существование</title>
		<link>http://alexvolkov.ru/a-simple-way-to-test-the-process-on-the-existence-of.html</link>
		<comments>http://alexvolkov.ru/a-simple-way-to-test-the-process-on-the-existence-of.html#comments</comments>
		<pubDate>Thu, 24 Mar 2011 18:43:25 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Скрипты]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1866</guid>
		<description><![CDATA[Для простых многопоточных систем очень часто используют запуск в фоновом режиме.  Запускают их примерно вот так: php script.php &#38; И управление процессом от юзера уходит, отловить такой процесс из другого скрипта уже не получится. А если процесс выполняет какую то одну и ту же задачу с интервалом по крону, и нужно, чтобы при запуска нового [...]]]></description>
			<content:encoded><![CDATA[<p>Для простых многопоточных систем очень часто используют запуск в фоновом режиме.  Запускают их примерно вот так:</p>
<pre class="brush:shell">php script.php &amp;</pre>
<p>И управление процессом от юзера уходит, отловить такой процесс из другого скрипта уже не получится. А если процесс выполняет какую то одну и ту же задачу с интервалом по крону, и нужно, чтобы при запуска нового процесса старый был убит? Поймать его можно аццкой смесью bash + php:</p>
<pre class="brush:php">$killPid = exec("ps ux | awk '/script_name.php/ &amp;&amp; !/awk/ {print $2}'");//находим пид процесса
      if($killPid)//если есть, киляем
	  exec ("kill ".$killPid);
exec('php script_name.php &amp;');//запускаем новый</pre>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li><a href="http://alexvolkov.ru/consider-how-many-lines-of-code-in-a-php-project.html" title="Считаем, сколько строк кода в php проекте.">Считаем, сколько строк кода в php проекте.</a></li><li><a href="http://alexvolkov.ru/examples-of-using-strace-to-debug-scripts.html" title="Примеры использования strace для отладки скриптов">Примеры использования strace для отладки скриптов</a></li><li><a href="http://alexvolkov.ru/watchdog-dlya-svoikh-skriptov-ili-proverka-sostoyaniya-processa.html" title="Watchdog для своих скриптов или проверка состояния процесса">Watchdog для своих скриптов или проверка состояния процесса</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/a-simple-way-to-test-the-process-on-the-existence-of.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Примеры использования strace для отладки скриптов</title>
		<link>http://alexvolkov.ru/examples-of-using-strace-to-debug-scripts.html</link>
		<comments>http://alexvolkov.ru/examples-of-using-strace-to-debug-scripts.html#comments</comments>
		<pubDate>Tue, 22 Mar 2011 16:47:41 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Скрипты]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[strace]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1835</guid>
		<description><![CDATA[Strace &#8212; это встроенный перехватчик системных вызовов и сигналов в линуксе. Основная его цель &#8212; это перехват информации относительно какого-то процесса. Крайне незаменимая штука при отладке скриптов, особенно закодированных. Пример использования &#8212; есть один сервис, который я написал, и обьявилась там проблема &#8212; каким-то неведомым образом права на файл, куда пишется лог, начали выставляться криво. [...]]]></description>
			<content:encoded><![CDATA[<p>Strace &#8212; это встроенный перехватчик системных вызовов и сигналов в линуксе. Основная его цель &#8212; это перехват информации относительно какого-то процесса. Крайне незаменимая штука при отладке скриптов, особенно закодированных.</p>
<p>Пример использования &#8212; есть один сервис, который я написал, и обьявилась там проблема &#8212; каким-то неведомым образом права на файл, куда пишется лог, начали выставляться криво. А именно: вместо положенных rw &#8212; rw &#8212; rw стали w &#8212; wx &#8212; wT. Проблема тут в том, что надо указывать права при смене не как:</p>
<pre class="brush:php">chmod('file.txt', '0666'); или
chmod('file.txt', 666);</pre>
<p>в этом случае 0666 будет string, а вот так:</p>
<pre class="brush:php">chmod('file.txt', intval('666', 8));</pre>
<p>Так они уже будут в корректной форме.</p>
<p>Вернемся к проблеме. Нужно было найти, кто ставит на файл неверные права. Вот так можно отловить все вызовы определенного файла:</p>
<pre class="brush:shell">strace php ./script.php 2&gt;&amp;1 | grep file.txt</pre>
<p>Ответ будет вида:</p>
<pre class="brush:shell">open("/path/to/file.txt", O_RDWR|O_CREAT|O_APPEND|O_LARGEFILE, 0666) = 4
chmod("/path/to/file.txt", 0666) = 0</pre>
<p>Вот так можно отмониторить все обращения к файлу<br />
<span id="more-1835"></span><br />
Однако у меня была проблема с записью при запуске через апача, т.е. скрипт запускался не от моего пользователя. Тут можно отмониторить по pid процесса, но нужен рут.</p>
<pre class="brush:shell">strace -p 123 2&gt;&amp;1 | grep file.txt</pre>
<p>Гашение вывода 2&gt;&amp;1 позволит не читать тонны ненужной инфы. Но для хардкорных дебаггеров можно убрать.</p>
<p>Еще вот примеры использования strace, <a href="http://www.hokstad.com/5-simple-ways-to-troubleshoot-using-strace.html">перевел отсюда</a></p>
<p>Смотрим, какие конфиги читает скрипт:</p>
<pre class="brush:shell">$ strace -e open php 2&gt;&amp;1 | grep php.ini
open("/usr/local/bin/php.ini", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/local/lib/php.ini", O_RDONLY) = 4</pre>
<p>Смотрим, почему скрипт не может открыть определенный файл:</p>
<pre class="brush:shell">$ strace -e open,access 2&gt;&amp;1 | grep your-filename</pre>
<p>Что процесс делает в данный момент:</p>
<pre class="brush:shell">root@dev:~# strace -p 15427
Process 15427 attached - interrupt to quit
futex(0x402f4900, FUTEX_WAIT, 2, NULL
Process 15427 detached</pre>
<p>Следующий пример очень полезен &#8212; показывает на что тратится процессорное время скриптом:</p>
<pre class="brush:shell">root@dev:~# strace -c -p 11084
Process 11084 attached - interrupt to quit
Process 11084 detached
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 94.59    0.001014          48        21           select
  2.89    0.000031           1        21           getppid
  2.52    0.000027           1        21           time
------ ----------- ----------- --------- --------- ----------------
100.00    0.001072                    63           total
root@dev:~#</pre>
<p>При таком вызове он будет отображать данные до тех пор, пока принудительно его не завершить.</p>
<p>Можно запросить  раскладку от начала до конца:</p>
<pre class="brush:shell">root@dev:~# strace -c &gt;/dev/null ls
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 23.62    0.000205         103         2           getdents64
 18.78    0.000163          15        11         1 open
 15.09    0.000131          19         7           read
 12.79    0.000111           7        16           old_mmap
  7.03    0.000061           6        11           close
  4.84    0.000042          11         4           munmap
  4.84    0.000042          11         4           mmap2
  4.03    0.000035           6         6         6 access
  3.80    0.000033           3        11           fstat64
  1.38    0.000012           3         4           brk
  0.92    0.000008           3         3         3 ioctl
  0.69    0.000006           6         1           uname
  0.58    0.000005           5         1           set_thread_area
  0.35    0.000003           3         1           write
  0.35    0.000003           3         1           rt_sigaction
  0.35    0.000003           3         1           fcntl64
  0.23    0.000002           2         1           getrlimit
  0.23    0.000002           2         1           set_tid_address
  0.12    0.000001           1         1           rt_sigprocmask
------ ----------- ----------- --------- --------- ----------------
100.00    0.000868                    87        10 total</pre>
<p>Вот такая полезная штука. Man strace, одним словом!</p>
<p>&nbsp;</p>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li><a href="http://alexvolkov.ru/a-simple-way-to-test-the-process-on-the-existence-of.html" title="Простой способ проверки процесса на существование">Простой способ проверки процесса на существование</a></li><li><a href="http://alexvolkov.ru/wordpress-i-memcache-2.html" title="Wordpress и memcache 2">Wordpress и memcache 2</a></li><li><a href="http://alexvolkov.ru/skripty-dlya-morfologicheskogo-analiza-teksta.html" title="Скрипты для морфологического анализа текста.">Скрипты для морфологического анализа текста.</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/examples-of-using-strace-to-debug-scripts.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Что делать, если сбил все права?</title>
		<link>http://alexvolkov.ru/what-to-do-if-you-blow-down-all-file-permissions.html</link>
		<comments>http://alexvolkov.ru/what-to-do-if-you-blow-down-all-file-permissions.html#comments</comments>
		<pubDate>Fri, 18 Mar 2011 19:48:41 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[шелл]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1827</guid>
		<description><![CDATA[Выставил я тут на рабочем сервере права на всю папку, в которой сайты лежат, 0777.  От души так, типа не жалко. Лучше и не спрашивайте, как так получилось)) Не, все работает конечно, но как-то немного стремно с полностью открытой на запись и выполнение папкой, доступной из веба жить И папок вложенных куча, руками нереально все [...]]]></description>
			<content:encoded><![CDATA[<p>Выставил я тут на рабочем сервере права на всю папку, в которой сайты лежат, 0777.  От души так, типа не жалко. Лучше и не спрашивайте, как так получилось))</p>
<p>Не, все работает конечно, но как-то немного стремно с полностью открытой на запись и выполнение папкой, доступной из веба жить <img src='http://alexvolkov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  И папок вложенных куча, руками нереально все права поправить.</p>
<p>Вобщем, правится так.</p>
<p>Сначала всем ставим 0644</p>
<pre class="brush:shell">chmod -R 0644 ./*</pre>
<p>Затем папкам ставим 0755</p>
<pre class="brush:shell">chmod -R 0755 ./$(find . -type d)</pre>
<p>P.S. Ну и главное правило напоследок -  Не лезь, блять, с несоображающей головой на рабочий сервер. Надо <a href="http://fucking-great-advice.ru/">сюда</a> будет его отправить, там таких много))</p>
<p>P.P.S. <a href="http://ru.wikipedia.org/wiki/Chmod">Вики рулит</a> )</p>
<p>Восстанавливаем текстовые файлы</p>
<pre class="brush:shell">find . -type f -exec chmod 644 {} \;</pre>
<p>Потом папки</p>
<pre class="brush:shell">find . -type d -exec chmod 755 {} \;</pre>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li><a href="http://alexvolkov.ru/organizaciya-bekapa-na-serverakh.html" title="Организация бекапа на серверах">Организация бекапа на серверах</a></li><li><a href="http://alexvolkov.ru/consider-how-many-lines-of-code-in-a-php-project.html" title="Считаем, сколько строк кода в php проекте.">Считаем, сколько строк кода в php проекте.</a></li><li><a href="http://alexvolkov.ru/a-simple-way-to-test-the-process-on-the-existence-of.html" title="Простой способ проверки процесса на существование">Простой способ проверки процесса на существование</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/what-to-do-if-you-blow-down-all-file-permissions.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>APT и его коровья суперсила</title>
		<link>http://alexvolkov.ru/apt-and-its-cow-superforce.html</link>
		<comments>http://alexvolkov.ru/apt-and-its-cow-superforce.html#comments</comments>
		<pubDate>Thu, 03 Feb 2011 19:58:57 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1803</guid>
		<description><![CDATA[Когда то я запостил скрин тара с его робким отказом, сегодня вот заметил такую штуку в apt: Интересно, в оригинальной английской убунте тоже самое написано или это перевод такой На закуску.Ничего нет похожего на этот пост, он неповторим]]></description>
			<content:encoded><![CDATA[<p>Когда то я запостил <a href="http://alexvolkov.ru/robkijj-tar.html">скрин тара с его робким отказом</a>, сегодня вот заметил такую штуку в apt:<br/><br />
<a href="http://alexvolkov.ru/wp-content/uploads/2011/02/Снимок.png"><img class="alignnone size-full wp-image-1804" title="Снимок" src="http://alexvolkov.ru/wp-content/uploads/2011/02/-e1296763004332.png" alt="" width="542" height="57" /></a><br/><br />
Интересно, в оригинальной английской убунте тоже самое написано или это перевод такой <img src='http://alexvolkov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li>Ничего нет похожего на этот пост, он неповторим</li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/apt-and-its-cow-superforce.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Star Wars 4: новая надежда :)</title>
		<link>http://alexvolkov.ru/star-wars-4-a-new-hope.html</link>
		<comments>http://alexvolkov.ru/star-wars-4-a-new-hope.html#comments</comments>
		<pubDate>Thu, 09 Dec 2010 11:24:33 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1799</guid>
		<description><![CDATA[Фильм, который наверно смотрели все, только он текстовый и показывается в шелле telnet towel.blinkenlights.nl Кстати, полезный сайтик, много всяких команд для консоли. На закуску.Ничего нет похожего на этот пост, он неповторим]]></description>
			<content:encoded><![CDATA[<p>Фильм, который наверно смотрели все, только он текстовый и показывается в шелле <img src='http://alexvolkov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre class="brush:shell">telnet towel.blinkenlights.nl</pre>
<p><a href="http://alexvolkov.ru/wp-content/uploads/2010/12/starwars-e1291893774818.png"><img src="http://alexvolkov.ru/wp-content/uploads/2010/12/starwars-e1291893774818.png" alt="" title="starwars" width="595" height="320" class="alignnone size-full wp-image-1800" /></a><br />
Кстати, <a href="http://www.commandlinefu.com/commands/view/7251/play-star-wars-episode-iv-in-your-terminal-?utm_source=feedburner&#038;utm_medium=feed&#038;utm_campaign=Feed%3A+Command-line-fu+%28Command-Line-Fu%29">полезный сайтик</a>, много всяких команд для консоли. </p>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li>Ничего нет похожего на этот пост, он неповторим</li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/star-wars-4-a-new-hope.html/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Watchdog для своих скриптов или проверка состояния процесса</title>
		<link>http://alexvolkov.ru/watchdog-dlya-svoikh-skriptov-ili-proverka-sostoyaniya-processa.html</link>
		<comments>http://alexvolkov.ru/watchdog-dlya-svoikh-skriptov-ili-proverka-sostoyaniya-processa.html#comments</comments>
		<pubDate>Sat, 02 Oct 2010 18:03:56 +0000</pubDate>
		<dc:creator>Alex Volkov</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://alexvolkov.ru/?p=1741</guid>
		<description><![CDATA[По просьбе одного камрада. Хотя мне самому такая штука давно нужна, т.к. апач на одном серваке любит отвалиться Постарался написать как можно короче, пхп тут постольку поскольку, основная работа на баше. Вкратце, чего делает. Запрашивает пид у процесса с именем $processName, если возвращается пустая строка, то запускается скрипт по указанному пути $pathToScript &#60;?php $processName = [...]]]></description>
			<content:encoded><![CDATA[<p>По просьбе одного камрада. Хотя мне самому такая штука давно нужна, т.к. апач на одном серваке любит отвалиться <img src='http://alexvolkov.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Постарался написать как можно короче, пхп тут постольку поскольку, основная работа на баше.<br />
Вкратце, чего делает. Запрашивает пид у процесса с именем <strong>$processName</strong>, если возвращается пустая строка, то запускается скрипт по указанному пути $pathToScript</p>
<pre class="brush:php">&lt;?php
$processName = 'script.php';
$pathToScript = '/home/alex/script.php';
$check = exec("ps a | grep " .$processName. " | grep -v grep | awk '{print $1}'");
if(strlen($check) &lt; 1){
	    exec("php ". $pathToScript ." ");
	} else {
	    echo 'all done\r\n';
	}

?&gt;</pre>
<p>По задумке ставится на минутный крон.</p>
<h2  class="related_post_title">На закуску.</h2><ul class="related_post"><li><a href="http://alexvolkov.ru/a-simple-way-to-test-the-process-on-the-existence-of.html" title="Простой способ проверки процесса на существование">Простой способ проверки процесса на существование</a></li><li><a href="http://alexvolkov.ru/php-debugging-and-profiling.html" title="Профилирование и отладка PHP скриптов">Профилирование и отладка PHP скриптов</a></li><li><a href="http://alexvolkov.ru/problems-with-the-serialization-of-arrays.html" title="Проблемы с сериализацией массивов">Проблемы с сериализацией массивов</a></li></ul>]]></content:encoded>
			<wfw:commentRss>http://alexvolkov.ru/watchdog-dlya-svoikh-skriptov-ili-proverka-sostoyaniya-processa.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
<!-- This Quick Cache file was built for (  alexvolkov.ru/category/linux/feed ) in 0.54392 seconds, on May 18th, 2012 at 10:02 am UTC. -->
<!-- This Quick Cache file will automatically expire ( and be re-built automatically ) on May 18th, 2012 at 11:02 am UTC -->
