<?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>заметки на полях &#187; shell</title>
	<atom:link href="http://svdev.ru/tag/shell/feed/" rel="self" type="application/rss+xml" />
	<link>http://svdev.ru</link>
	<description>Блокнот разработчика</description>
	<lastBuildDate>Thu, 08 Dec 2011 11:40:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Упрощение отслеживания отработанных по крону скриптов</title>
		<link>http://svdev.ru/blog/php-cron-spy/</link>
		<comments>http://svdev.ru/blog/php-cron-spy/#comments</comments>
		<pubDate>Thu, 06 Oct 2011 07:54:14 +0000</pubDate>
		<dc:creator>Дерябин Сергей</dc:creator>
				<category><![CDATA[неразобранное]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://svdev.ru/?p=653</guid>
		<description><![CDATA[Пожалуй в любом более менее крупном проекте возникает необходимость выполнения заданий по крону, т. е. независимо от действий пользователей с определенной периодичностью. Совершенно определенно что результат выполнения скриптов необходимо отслеживать, что бы вовремя узнать о возникшей проблеме. Самый простой вариант, это генерация отчета о работе или ошибки в скрипте и отправке из крона на почту, [...]]]></description>
			<content:encoded><![CDATA[<p>Пожалуй в любом более менее крупном проекте возникает необходимость выполнения заданий по крону, т. е. независимо от действий пользователей с определенной периодичностью. Совершенно определенно что результат выполнения скриптов необходимо отслеживать, что бы вовремя узнать о возникшей проблеме. Самый простой вариант, это генерация отчета о работе или ошибки в скрипте и отправке из крона на почту, как то так (из крона, а не из скрипта потому что <strong>fatal error</strong> на почту из скрипта не придет):</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000;">17</span> <span style="color: #000000;">3</span> &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> www-data <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php5-cgi <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>project<span style="color: #000000; font-weight: bold;">/</span>cron<span style="color: #000000; font-weight: bold;">/</span>user_rating.php <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> mail <span style="color: #660033;">-s</span> <span style="color: #ff0000;">&quot;Пересчет рейтинга пользователей&quot;</span> mail<span style="color: #000000; font-weight: bold;">@</span>example.com</div></div>
<p>В итоге на почту периодически будут сваливаться отчеты вида:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">X-Powered-By: PHP<span style="color: #000000; font-weight: bold;">/</span>5.2.6-<span style="color: #000000;">1</span>+lenny13<br />
Content-type: text<span style="color: #000000; font-weight: bold;">/</span>html<br />
<br />
Начало: <span style="color: #000000;">2011</span>-<span style="color: #000000;">10</span>-03 03:<span style="color: #000000;">17.01</span><br />
<br />
... сгенерированные данные о проделанной работе ...<br />
<br />
Окончание: <span style="color: #000000;">2011</span>-<span style="color: #000000;">10</span>-03 03:<span style="color: #000000;">17.01</span></div></div>
<p>Все хорошо. Но иногда бывает что дергать такие скрипты необходимо часто (дабы избежать задержки), а вот что-то делать они будут далеко не всегда, т. е. попросту запускаться, смотреть что ничего делать не надо генерит пустой отчет и все. А вот когда этих скриптов становится много, то наступает такой момент когда только просмотреть отчеты на почте занимает неприлично много времени, потом это надоедает и отчеты просто не просматриваясь удаляются. Теряется смысл вообще всех этих отчетов.<br />
Выход нашелся в следующем. При отсутствии действий в скрипте не генерировать пустой отчет, т. е. не выводить ничего, а по крону смотреть, что если в выхлопе только три строки:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">X-Powered-By: PHP<span style="color: #000000; font-weight: bold;">/</span>5.2.6-<span style="color: #000000;">1</span>+lenny13<br />
Content-type: text<span style="color: #000000; font-weight: bold;">/</span>html</div></div>
<p>то на почту ничего отправлять не надо.<br />
Делаем скрипт <code class="codecolorer bash default"><span class="bash"><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php_cron.sh</span></code>:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/sh</span><br />
<br />
<span style="color: #007800;">strtocut</span>=<span style="color: #000000;">3</span><br />
<span style="color: #666666; font-style: italic;"># минимальная длина на всякий случай, может лишний перенос закрадется</span><br />
<span style="color: #007800;">minlen</span>=<span style="color: #000000;">10</span><br />
<br />
<span style="color: #007800;">line</span>=<span style="color: #000000;">1</span><br />
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> INPUT; <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$line</span> <span style="color: #660033;">-gt</span> <span style="color: #007800;">$strtocut</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #007800;">OUTPUT</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">${OUTPUT}</span><span style="color: #000099; font-weight: bold;">\n</span><span style="color: #007800;">${INPUT}</span>&quot;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; &nbsp; <span style="color: #007800;">line</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">expr</span> <span style="color: #007800;">$line</span> + <span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">`</span><br />
<span style="color: #000000; font-weight: bold;">done</span><br />
<br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">expr</span> length <span style="color: #ff0000;">&quot;<span style="color: #007800;">$OUTPUT</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span> <span style="color: #660033;">-gt</span> <span style="color: #007800;">$minlen</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #660033;">-e</span> <span style="color: #007800;">$OUTPUT</span> <span style="color: #000000; font-weight: bold;">|</span> mail <span style="color: #660033;">-s</span><span style="color: #ff0000;">&quot;$2&quot;</span> <span style="color: #007800;">$1</span><br />
<span style="color: #000000; font-weight: bold;">fi</span></div></div>
<p>даем ему права на выполнение</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;">$ </span><span style="color: #c20cb9; font-weight: bold;">chmod</span> +x <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php_cron.sh</div></div>
<p>и изменяем задание в кроне следующим образом:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000;">17</span> <span style="color: #000000;">8</span> &nbsp; &nbsp;<span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> www-data <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php5-cgi <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>project<span style="color: #000000; font-weight: bold;">/</span>cron<span style="color: #000000; font-weight: bold;">/</span>paid_notifier.php <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;&amp;</span><span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>php-cron.sh mail<span style="color: #000000; font-weight: bold;">@</span>example.com <span style="color: #ff0000;">&quot;Отправка уведомлений об окончании услуг&quot;</span></div></div>
<p>Теперь на почту будут приходить только сообщения о проделанной работе, а о том что делать было нефиг нас не потревожат.</p>
<p>P/S С удовольствием приму вариант более элегантного решения. <img src='http://svdev.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://svdev.ru/blog/php-cron-spy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Backup проекта, часть 2</title>
		<link>http://svdev.ru/blog/backup-advanced/</link>
		<comments>http://svdev.ru/blog/backup-advanced/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 17:54:40 +0000</pubDate>
		<dc:creator>Дерябин Сергей</dc:creator>
				<category><![CDATA[неразобранное]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://svdev.ru/?p=391</guid>
		<description><![CDATA[Немного ранее, был представлен SHELL скрипт резервного сохранения данных проекта. При наличии нескольких проектов хочется каким-то образом систематизировать этот процесс, для облегчения подключения новых проектов к резервному копированию, кроме как плодить файлы с дублированием кода, учитывая тот факт, что со временем может измениться логика выполняемых действий или настройки подключения к БД/FTP серверу. Вынесем общую логику [...]]]></description>
			<content:encoded><![CDATA[<p>Немного ранее, был представлен <a href="/blog/backup-simple/">SHELL скрипт резервного сохранения данных проекта</a>. При наличии нескольких проектов хочется каким-то образом систематизировать этот процесс, для облегчения подключения новых проектов к резервному копированию, кроме как плодить файлы с дублированием кода, учитывая тот факт, что со временем может измениться логика выполняемых действий или настройки подключения к БД/FTP серверу.</p>
<p>Вынесем общую логику в отдельный скрипт, а индивидуальные данные проекта, такие как имя БД и загружаемые файлы в конфигурационный файл для каждого проекта.<br />
<span id="more-391"></span><br />
Для получения дампа БД, если проекты на сервере используют один сервер, но различные базы удобно создать отдельного пользователя для нашего скрипта и дать ему права на чтение и блокировку таблиц необходимых БД:</p>
<div class="codecolorer-container sql vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">USER</span> backup@localhost <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> &nbsp;<span style="color: #ff0000;">'dbpassword'</span>;<br />
<span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">SELECT</span><span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">LOCK</span> <span style="color: #993333; font-weight: bold;">TABLES</span> <span style="color: #993333; font-weight: bold;">ON</span> &nbsp;svdev<span style="color: #66cc66;">.*</span> <span style="color: #993333; font-weight: bold;">TO</span> &nbsp;backup@localhost;</div></div>
<p>Далее немного модифицируем <a href="/blog/backup-simple/">скрипт из предыдущей</a> части для подключения настроек. Так же проект может не использовать БД или использовать совместно с другим проектом, в этом случае достаточно сохранить её один раз &#8211; такая возможность так же реализована. Вот что получилось в итоге:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/sh</span><br />
<br />
<span style="color: #666666; font-style: italic;">#Данные для подключения к БД</span><br />
<br />
<span style="color: #007800;">DBUSER</span>=<span style="color: #ff0000;">&quot;backup&quot;</span><br />
<span style="color: #007800;">DBPASS</span>=<span style="color: #ff0000;">&quot;dbpassword&quot;</span><br />
<br />
<span style="color: #666666; font-style: italic;"># FTP для сохранения данных</span><br />
<span style="color: #007800;">FTPUSER</span>=<span style="color: #ff0000;">'ftpuser'</span><br />
<span style="color: #007800;">FTPHOST</span>=<span style="color: #ff0000;">'ftphost'</span><br />
<span style="color: #007800;">FTPPASS</span>=<span style="color: #ff0000;">'ftppassword'</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Путь на FTP где хранятся бэкапы, общая директория,</span><br />
<span style="color: #666666; font-style: italic;"># в которой для каждого проекта есть поддиректория,</span><br />
<span style="color: #666666; font-style: italic;"># путь от домашней директории пользователя FTP</span><br />
<span style="color: #007800;">FTPPATH</span>=<span style="color: #ff0000;">&quot;./&quot;</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Дата, для именования файла бэкапа в формате YYYY.MM.DD</span><br />
<span style="color: #007800;">DT</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #ff0000;">'+%Y.%m.%d'</span><span style="color: #000000; font-weight: bold;">`</span><br />
<span style="color: #666666; font-style: italic;"># Временная директория для хранения файлов</span><br />
<span style="color: #007800;">TEMPDIR</span>=<span style="color: #ff0000;">&quot;/tmp/backup-&quot;</span><span style="color: #007800;">$DT</span><span style="color: #ff0000;">&quot;/&quot;</span><br />
<span style="color: #007800;">SQLFILE</span>=<span style="color: #ff0000;">&quot;dump.sql&quot;</span><br />
<span style="color: #666666; font-style: italic;"># Файл архива</span><br />
<span style="color: #007800;">DESTFILE</span>=<span style="color: #007800;">$DT</span><span style="color: #ff0000;">&quot;.tar&quot;</span><br />
<br />
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #007800;">$TEMPDIR</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$TEMPDIR</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Начало резервного копирования: &quot;</span><span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #ff0000;">'+%F %T'</span><span style="color: #000000; font-weight: bold;">`</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Если все проекты находятся в директории /var/www то для каждого, который</span><br />
<span style="color: #666666; font-style: italic;"># необходимо сохранить должен быть файл backup.conf</span><br />
<span style="color: #000000; font-weight: bold;">for</span> CONFIG <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">find</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www <span style="color: #660033;">-mindepth</span> <span style="color: #000000;">2</span> <span style="color: #660033;">-maxdepth</span> <span style="color: #000000;">2</span> <span style="color: #660033;">-name</span> backup.conf<span style="color: #000000; font-weight: bold;">`</span><br />
<span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; . <span style="color: #007800;">$CONFIG</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Если в конфиге установлено имя БД, до делаем её дамп</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># и добавляем в архив</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-z</span> <span style="color: #007800;">$DBNAME</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; mysqldump <span style="color: #660033;">--user</span>=<span style="color: #007800;">$DBUSER</span> <span style="color: #660033;">--password</span>=<span style="color: #007800;">$DBPASS</span> <span style="color: #007800;">$DBNAME</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #007800;">$SQLFILE</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #007800;">TARFILES</span>=<span style="color: #007800;">$TARFILES</span><span style="color: #ff0000;">&quot; -C &quot;</span><span style="color: #007800;">$TEMPDIR</span><span style="color: #ff0000;">&quot; &quot;</span><span style="color: #007800;">$SQLFILE</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-cf</span> <span style="color: #007800;">$DESTFILE</span> <span style="color: #007800;">$TARFILES</span><br />
&nbsp; &nbsp; <span style="color: #c20cb9; font-weight: bold;">gzip</span> <span style="color: #660033;">-9</span> <span style="color: #007800;">$DESTFILE</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Отправляем полученный архив на FTP; не забываем</span><br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># включить бинарный режим передачи, иначе архивы побъются </span><br />
&nbsp; &nbsp; <span style="color: #c20cb9; font-weight: bold;">ftp</span> <span style="color: #660033;">-n</span> <span style="color: #007800;">$FTPHOST</span> <span style="color: #000000; font-weight: bold;">&lt;&lt;</span>EOF<br />
&nbsp; &nbsp; quote USER <span style="color: #007800;">$FTPUSER</span><br />
&nbsp; &nbsp; quote PASS <span style="color: #007800;">$FTPPASS</span> &nbsp; &nbsp;<br />
&nbsp; &nbsp; binary <br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$FTPPATH</span><span style="color: #007800;">$PROJECTNAME</span><br />
&nbsp; &nbsp; put <span style="color: #007800;">$DESTFILE</span><span style="color: #ff0000;">&quot;.gz&quot;</span><br />
&nbsp; &nbsp; quit<br />
&nbsp; &nbsp; EOF<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot; - &quot;</span><span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #ff0000;">'+%F %T'</span><span style="color: #000000; font-weight: bold;">`</span><span style="color: #ff0000;">&quot; проект &quot;</span><span style="color: #007800;">$PROJECTNAME</span><span style="color: #ff0000;">&quot; сохранен, размер архива &quot;</span><span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">stat</span> <span style="color: #660033;">-c</span> <span style="color: #000000; font-weight: bold;">%</span>s <span style="color: #007800;">$DESTFILE</span><span style="color: #ff0000;">'.gz'</span><span style="color: #000000; font-weight: bold;">`</span><span style="color: #ff0000;">&quot; байт;&quot;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #666666; font-style: italic;"># Удаляем за собой все файлы</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> TFILE <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$TEMPDIR</span><span style="color: #ff0000;">&quot;/*&quot;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> <span style="color: #007800;">$TFILE</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">done</span><br />
<span style="color: #000000; font-weight: bold;">done</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Удаляем за собой временную директорию</span><br />
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> <span style="color: #007800;">$TEMPDIR</span></div></div>
<p>Полученный файл назовем <code class="codecolorer bash default"><span class="bash">sites-backup</span></code> и положим его в <code class="codecolorer bash default"><span class="bash"><span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>cron.daily<span style="color: #000000; font-weight: bold;">/</span></span></code> таким образом он будет запускаться один раз в сутки, вместе с остальными служебными скриптами, такими как ротация логов и другие. Для пущей надежности права на файл лучше дать 700 и сделать владельцем рута:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chown</span> root:root <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>cron.daily<span style="color: #000000; font-weight: bold;">/</span>sites-backup<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> 0700 <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>cron.daily<span style="color: #000000; font-weight: bold;">/</span>sites-backup</div></div>
<p>Осталось только для каждого проекта создать файл конфига. К примеру для проекта svdev, получаем следующий конфиг <code class="codecolorer bash default"><span class="bash"><span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>svdev.ru<span style="color: #000000; font-weight: bold;">/</span>backup.conf</span></code>:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/sh</span><br />
<span style="color: #007800;">DBNAME</span>=<span style="color: #ff0000;">&quot;svdev&quot;</span><br />
<span style="color: #007800;">PROJECTNAME</span>=<span style="color: #ff0000;">&quot;svdev.ru&quot;</span><br />
<span style="color: #007800;">TARFILES</span>=<span style="color: #ff0000;">&quot; -C /var/www/svdev.ru/htdocs wp-config.php -C /var/www/svdev.ru/htdocs/wp-content uploads&quot;</span></div></div>
<p>Если БД не используется, то необходимо указать пустую строку в качестве имени БД:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/sh</span><br />
<span style="color: #007800;">DBNAME</span>=<span style="color: #ff0000;">&quot;&quot;</span><br />
<span style="color: #007800;">PROJECTNAME</span>=<span style="color: #ff0000;">&quot;svdev.ru&quot;</span><br />
<span style="color: #007800;">TARFILES</span>=<span style="color: #ff0000;">&quot; -C /var/www/svdev.ru/htdocs wp-config.php -C /var/www/svdev.ru/htdocs/wp-content uploads&quot;</span></div></div>
<p>Теперь <strong>для создания бэкапов</strong> нового проекта <strong>необходимо дать права пользователю скрипта на БД</strong>, <strong>создать на удаленном FTP директорию</strong> куда будут складываться архивы <strong>и добавить конфиг из 3х строчек</strong>.</p>
<p>Главное не забывать вовремя чистить FTP.</p>
]]></content:encoded>
			<wfw:commentRss>http://svdev.ru/blog/backup-advanced/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Backup проекта</title>
		<link>http://svdev.ru/blog/backup-simple/</link>
		<comments>http://svdev.ru/blog/backup-simple/#comments</comments>
		<pubDate>Wed, 25 Nov 2009 20:20:07 +0000</pubDate>
		<dc:creator>Дерябин Сергей</dc:creator>
				<category><![CDATA[неразобранное]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://svdev.ru/?p=351</guid>
		<description><![CDATA[Люди делятся на тех кто еще не делает и тех, кто уже делает бэкапы Обязательным свойством любого проекта являются резервное сохранение данных. И так, приступим. Допустим все данные у нас хранятся в БД (в моем случае mysql, но если это postgres &#8211; отличие будет в одной строчке) и существуют различные файлы загружаемые пользователями. Файлы проекта [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;"><em>Люди делятся на тех кто <strong>еще</strong> не делает<br />
и тех, кто <strong>уже</strong> делает бэкапы</em></p>
<p style="text-align: left;">Обязательным свойством любого проекта являются резервное сохранение данных. И так, приступим. Допустим все данные у нас хранятся в БД (в моем случае mysql, но если это postgres &#8211; отличие будет в одной строчке) и существуют различные файлы загружаемые пользователями. Файлы проекта хранятся в репозитории, поэтому за их сохранность можно не беспокоиться (можно на всякий случай еще сохранять конфиг). Так же понадобится другая машина для сохранения бэкапов, более чем достаточно иметь FTP на другой машине.</p>
<p style="text-align: left;"><strong>UPD:</strong> Немного подчищен код и приведен к соответствию соглашениям.</p>
<p><span id="more-351"></span></p>
<p style="text-align: left;">Начнем с сохранения БД:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/sh</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Данные для подключения к БД</span><br />
<span style="color: #007800;">DBUSER</span>=<span style="color: #ff0000;">&quot;dbuser&quot;</span><br />
<span style="color: #007800;">DBNAME</span>=<span style="color: #ff0000;">&quot;dbname&quot;</span><br />
<span style="color: #007800;">DBPASS</span>=<span style="color: #ff0000;">&quot;password&quot;</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Дата, для именования файла бэкапа в формате YYYY.MM.DD</span><br />
<span style="color: #007800;">DT</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #ff0000;">'+%Y.%m.%d'</span><span style="color: #000000; font-weight: bold;">`</span><br />
<span style="color: #666666; font-style: italic;"># Временная директория для хранения файлов</span><br />
<span style="color: #007800;">TEMPDIR</span>=<span style="color: #ff0000;">&quot;/tmp/backup-&quot;</span><span style="color: #007800;">$DT</span><span style="color: #ff0000;">&quot;/&quot;</span><br />
<span style="color: #007800;">SQLFILE</span>=<span style="color: #ff0000;">&quot;backup.sql&quot;</span><br />
<br />
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #007800;">$TEMPDIR</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$TEMPDIR</span><br />
<br />
mysqldump <span style="color: #660033;">--user</span>=<span style="color: #007800;">$DBUSER</span> <span style="color: #660033;">--password</span>=<span style="color: #007800;">$DBPASS</span> <span style="color: #007800;">$DBNAME</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #007800;">$SQLFILE</span></div></td></tr></tbody></table></div>
<p>Итак у нас теперь есть дамп БД и мы знаем какие пользовательские файлы необходимо сохранять. Собираем их в один архив, сжимаем его и кладем через FTP на другую машину. В итоге получается следующий скрипт:</p>
<div class="codecolorer-container bash vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/sh</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Данные для подключения к БД</span><br />
<span style="color: #007800;">DBUSER</span>=<span style="color: #ff0000;">&quot;dbuser&quot;</span><br />
<span style="color: #007800;">DBNAME</span>=<span style="color: #ff0000;">&quot;dbname&quot;</span><br />
<span style="color: #007800;">DBPASS</span>=<span style="color: #ff0000;">&quot;password&quot;</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Данные для подключения по FTP</span><br />
<span style="color: #007800;">FTPUSER</span>=<span style="color: #ff0000;">'ftpuser'</span><br />
<span style="color: #007800;">FTPHOST</span>=<span style="color: #ff0000;">'ftp.svdev.ru'</span><br />
<span style="color: #007800;">FTPPASS</span>=<span style="color: #ff0000;">'password'</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Дата, для именования файла бэкапа в формате YYYY.MM.DD</span><br />
<span style="color: #007800;">DT</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> <span style="color: #ff0000;">'+%Y.%m.%d'</span><span style="color: #000000; font-weight: bold;">`</span><br />
<span style="color: #666666; font-style: italic;"># Временная директория для хранения файлов</span><br />
<span style="color: #007800;">TEMPDIR</span>=<span style="color: #ff0000;">&quot;/tmp/backup-&quot;</span><span style="color: #007800;">$DT</span><span style="color: #ff0000;">&quot;/&quot;</span><br />
<span style="color: #007800;">SQLFILE</span>=<span style="color: #ff0000;">&quot;backup.sql&quot;</span><br />
<span style="color: #666666; font-style: italic;"># Путь на FTP куда положим файл</span><br />
<span style="color: #666666; font-style: italic;"># !!! Путь от корня домашней директории FTP</span><br />
<span style="color: #007800;">REMOTEDIR</span>=<span style="color: #ff0000;">&quot;backups/svdev&quot;</span><br />
<span style="color: #666666; font-style: italic;"># Файл архива</span><br />
<span style="color: #007800;">DESTFILE</span>=<span style="color: #007800;">$DT</span><span style="color: #ff0000;">&quot;.tar&quot;</span><br />
<br />
<span style="color: #007800;">TARFILES</span>=<span style="color: #ff0000;">&quot; -C /var/www/svdev/htdocs wp-config.php -C /var/www/svdev/htdocs/wp-content uploads -C &quot;</span><span style="color: #007800;">$TEMPDIR</span><span style="color: #ff0000;">&quot; backup.sql&quot;</span><br />
<br />
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #007800;">$TEMPDIR</span><br />
<span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$TEMPDIR</span><br />
mysqldump <span style="color: #660033;">--user</span>=<span style="color: #007800;">$DBUSER</span> <span style="color: #660033;">--password</span>=<span style="color: #007800;">$DBPASS</span> <span style="color: #007800;">$DBNAME</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #007800;">$SQLFILE</span><br />
<span style="color: #c20cb9; font-weight: bold;">tar</span> cf <span style="color: #007800;">$DESTFILE</span> <span style="color: #007800;">$TARFILES</span><br />
<span style="color: #c20cb9; font-weight: bold;">gzip</span> <span style="color: #660033;">-9</span> <span style="color: #007800;">$DESTFILE</span><br />
<span style="color: #c20cb9; font-weight: bold;">ftp</span> <span style="color: #660033;">-n</span> <span style="color: #007800;">$FTPHOST</span> <span style="color: #cc0000; font-style: italic;">&lt;&lt;EOF<br />
quote USER $FTPUSER<br />
quote PASS $FTPPASS<br />
binary<br />
cd $REMOTEDIR<br />
put $DESTFILE&quot;.gz&quot;<br />
quit<br />
EOF</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Удаляем за собой все временные файлы</span><br />
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> <span style="color: #007800;">$TEMPDIR</span><br />
<br />
<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span></div></td></tr></tbody></table></div>
<p>Вот в принципе и все, осталось прописать его в крон и можно наслаждаться результатом.</p>
<p>Данный пример является самым простым, что хотелось бы добавить:</p>
<ul>
<li>вынесение алгоритма в общий шаблон, а для проекта оставить только определение констант. Таким образом при наличии нескольких проектов &#8211; подключение/отключение бэкапов будет задаваться одним симлинком</li>
<li>скрипта для удаления старых бэкапов (в данной схеме это необходимо делать вручную)</li>
</ul>
<p>Можно скачать приведенный пример: <a href="/wp-content/uploads/2009/11/backup.tar.gz">backup.tar.gz</a> и поэксперементировать с ним в свое удовольствие.</p>
<p><span style="text-decoration: underline;">Использованный полезный материал:</span></p>
<ul>
<li><a href="http://www.opennet.ru/docs/RUS/bash_scripting_guide/index.html" target="_blank">Advanced Bash-Scripting Guide</a></li>
<li><a href="http://www.opennet.ru/base/dev/shell_coding.txt.html" target="_blank">Shell-кодинг</a> (азы так сказать)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://svdev.ru/blog/backup-simple/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

