<?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>hudson@work &#187; bash</title>
	<atom:link href="http://hudson.su/tag/bash/feed/" rel="self" type="application/rss+xml" />
	<link>http://hudson.su</link>
	<description>статьи о web-разработке, менеджменте IT проектов и контроле качества</description>
	<lastBuildDate>Fri, 20 Jan 2012 13:15:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Скрипт для бэкапа mysql баз</title>
		<link>http://hudson.su/2011/03/03/mysql-backup-script/</link>
		<comments>http://hudson.su/2011/03/03/mysql-backup-script/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 16:14:43 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1821</guid>
		<description><![CDATA[Написал для себя простенький скрипт (linux bash) для бэкапа всех баз на одном сервере. Его отличительные особенности: Наличие списка исключений (т.е. бэкапим все кроме&#8230;) Получение списка всех БД из MySQL (не надо добавлять вновь созданные базы к бекапу) Создание директории под бэкап вида &#8220;&#8230;/YYYY/mm/dd/HH-MM/&#8221; Бэкап каждой базы в отдельный файл вида &#8220;YYYY-mm-dd.HH-MM.databasename.backup.sql&#8221; (mysqldump бэкапит все [...]]]></description>
			<content:encoded><![CDATA[<p>Написал для себя простенький скрипт (linux bash) для бэкапа всех баз на одном сервере. Его отличительные особенности:</p>
<ul>
<li>Наличие списка исключений (т.е. бэкапим все кроме&#8230;)</li>
<li>Получение списка всех БД из MySQL (не надо добавлять вновь созданные базы к бекапу)</li>
<li>Создание директории под бэкап вида &#8220;&#8230;/YYYY/mm/dd/HH-MM/&#8221;</li>
<li>Бэкап каждой базы в отдельный файл вида &#8220;YYYY-mm-dd.HH-MM.databasename.backup.sql&#8221; (mysqldump бэкапит все в один файл)</li>
<li>Архивирование бэкапа в тарбол</li>
<li>Зачистка .sql</li>
</ul>
<p>Собственно к написанию скрипта меня сподвигло именно то что mysqldump бэкапит все что ему сказано в один файл (если требуется восстановить одну базу, то попробуй ее выцарапай из общего дампа&#8230;), а создавать отдельную строку для бэкапа всякой новой БД геморно (об этом как минимум надо вспомнить!).</p>
<p>В общем если интересно &#8211; прошу под кат:</p>
<p><span id="more-1821"></span><br />
Собственно сам скрипт</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #666666; font-style: italic;">##</span>
<span style="color: #666666; font-style: italic;"># MySQL backup utility</span>
<span style="color: #666666; font-style: italic;"># @author dmitry.bykadorov@gmail.com</span>
<span style="color: #666666; font-style: italic;">##</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># current date</span>
<span style="color: #007800;">DATE</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>Y-<span style="color: #000000; font-weight: bold;">%</span>M-<span style="color: #000000; font-weight: bold;">%</span>d<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># y/m/d/h/m separately</span>
<span style="color: #007800;">YEAR</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>Y<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">MONTH</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>m<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">DAY</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>d<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">HOURS</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>H<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">MINUTES</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>M<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># database credentials</span>
<span style="color: #007800;">DBUSER</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #007800;">DBPASS</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #007800;">DBHOST</span>=<span style="color: #ff0000;">&quot;&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># create list of databases</span>
mysql <span style="color: #660033;">-h</span> <span style="color: #007800;">$DBHOST</span> <span style="color: #660033;">-u</span> <span style="color: #007800;">$DBUSER</span> -p<span style="color: #007800;">$DBPASS</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;show databases;&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>databases.list
&nbsp;
<span style="color: #666666; font-style: italic;"># create backup dir (e.g. ../2011/01/01/04-00)</span>
<span style="color: #007800;">BACKUP_DIR</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>backups<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$YEAR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$MONTH</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$DAY</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$HOURS</span>-<span style="color: #007800;">$MINUTES</span>
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">--parents</span> <span style="color: #660033;">--verbose</span> <span style="color: #007800;">$BACKUP_DIR</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># excludes list (Database is a part of SHOW DATABASES output)</span>
<span style="color: #007800;">EXCLUDES</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #ff0000;">'Database'</span> <span style="color: #ff0000;">'information_schema'</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #007800;">NUM_EXCLUDES</span>=<span style="color: #800000;">${#EXCLUDES[@]}</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> database <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>databases.list<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #007800;">skip</span>=<span style="color: #000000;">0</span>
&nbsp;
  <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">count</span>=<span style="color: #000000;">0</span>
  <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$count</span> <span style="color: #660033;">-lt</span> <span style="color: #007800;">$NUM_EXCLUDES</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #666666; font-style: italic;"># check if this name in excludes list</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$database</span>&quot;</span> = <span style="color: #800000;">${EXCLUDES[$count]}</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">then</span>
      <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">skip</span>=<span style="color: #000000;">1</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
    <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">count</span>=<span style="color: #007800;">$count</span>+<span style="color: #000000;">1</span>
  <span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$skip</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;++ <span style="color: #007800;">$database</span>&quot;</span>
    <span style="color: #666666; font-style: italic;"># now we can backup current database</span>
    <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$BACKUP_DIR</span>
    <span style="color: #007800;">backup_name</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$YEAR</span>-<span style="color: #007800;">$MONTH</span>-<span style="color: #007800;">$DAY</span>.<span style="color: #007800;">$HOURS</span>-<span style="color: #007800;">$MINUTES</span>.<span style="color: #007800;">$database</span>.backup.sql&quot;</span>
    <span style="color: #007800;">backup_tarball_name</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>.tar.gz&quot;</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>mysqldump <span style="color: #660033;">-h</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$DBHOST</span>&quot;</span> <span style="color: #660033;">--databases</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$database</span>&quot;</span> <span style="color: #660033;">-u</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$DBUSER</span>&quot;</span> <span style="color: #660033;">--password</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$DBPASS</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;   backup <span style="color: #007800;">$backup_name</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-zcf</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_tarball_name</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;   compress <span style="color: #007800;">$backup_tarball_name</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;   cleanup <span style="color: #007800;">$backup_name</span>&quot;</span>
  <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>databases.list<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;done!&quot;</span></pre></div></div>

<p>Можете его свободно:</p>
<ul>
<li>использовать (никаких гарантий я вам конечно же не даю &#8211; на свой страх и риск )))</li>
<li>модифицировать (например добавить выгрузку бэкапа на другой сервер или на Amazon S3 )))</li>
<li>критиковать ))</li>
</ul>
<p>P.S. Если таки будете использовать &#8211; не забудьте подставить ваши mysql credentials ))</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/03/03/mysql-backup-script/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Скрипт просмотра объема памяти, потребляемого процессами в linux</title>
		<link>http://hudson.su/2010/01/22/script-memory-usage-in-linux/</link>
		<comments>http://hudson.su/2010/01/22/script-memory-usage-in-linux/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 15:54:05 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[awk]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=771</guid>
		<description><![CDATA[Часто возникает необходимость посмотреть суммарное потребление памяти группой однотипных процессов (кумулятивно). top и ps без обработки не сильно помогает, поэтому сегодня написал следующий скрипт: Собственно скрипт #!/bin/bash ps -eo pid,comm,user,%mem &#124; awk ' { memory[$2]+=$4; } END { print( "--== Cumulative memory usage TOP: ==--" ); print( "--------------------------------------" ); print( "%MEM t&#124; COMM" ); print( [...]]]></description>
			<content:encoded><![CDATA[<p>Часто возникает необходимость посмотреть суммарное потребление памяти группой однотипных процессов (кумулятивно). top и ps без обработки не сильно помогает, поэтому сегодня написал следующий скрипт:</p>
<p><span id="more-771"></span></p>
<p>Собственно скрипт</p>
<pre>#!/bin/bash
ps -eo pid,comm,user,%mem | awk '
{
    memory[$2]+=$4;
}
END
{
    print( "--== Cumulative memory usage TOP: ==--" );
    print( "--------------------------------------" );
    print( "%MEM t| COMM" );
    print( "--------------------------------------" );
    while( length(memory) &gt; 0 )
    {
        max = -1;
        for( i in memory )
        {
            if( memory[i]&gt;max )
            {
                max_index = i;
                max = memory[max_index];
            }
        }
        delete memory[max_index];
        print( max, "t| ", max_index  );
    }
}' | less
</pre>
<p>Несколько комментариев:</p>
<ul>
<li>Сначала получаем список процессов при помощи <strong>ps</strong>. Выглядит он примерно так:</li>
</ul>
<pre>  PID COMMAND         USER     %MEM
    1 init            root      0.0
    2 migration/0     root      0.0
    3 ksoftirqd/0     root      0.0
    4 watchdog/0      root      0.0
    5 migration/1     root      0.0
    6 ksoftirqd/1     root      0.0
</pre>
<ul>
<li>Затем при помощи <strong>awk </strong>собираем кумулятивные данные в массив ( <em>memory[$2]+=$4;</em> ). Тут думаю все понятно.</li>
<li>Последним штрихом является сортировка кумулятивных значений и их отображение. К сожалению <strong>asort</strong>, встроенный в <strong>gawk</strong>,<strong> </strong>выдавал что-то неудобоваримое, пришлось написать простую сортировку самостоятельно. Пока массив memory содержит элементы, пробегаем мессив memory, ищем максимальный элемент, печатаем его, удаляем максимальный элемент ( <em>delete memory[max_index];</em> ). Каждую итерацию, массив memory уменьшается на один элемент.</li>
<li>less добавлен для удобства использования.</li>
</ul>
<p>Результат работы скрипта:</p>
<pre>--== Cumulative memory usage TOP: ==--
--------------------------------------
%MEM    | COMM
--------------------------------------
7.4     |  httpd
3.1     |  clamd
2.8     |  spamd
0.6     |  mysqld
0.4     |  yum-updatesd
0.2     |  named
0.1     |  ntpd
0.1     |  munin-node
0       |  rpciod/1
0       |  rpciod/2
0       |  udevd
</pre>
<p>Боле короткая форма записи для скрипта (без сортировки, но в одну строку):</p>
<pre>
#
ps -eo pid,comm,user,%mem | awk '{memory[$2]+=$4} END{ print( "%MEM t| COMM" ); for( proc in memory ) print( memory[proc], "t| ", proc  ); }' | less
</pre>
<p>Have fun ))</p>
<p>p.s. Можно добавить еще распознавание и группировку таких процессов rpciod/1 и rpciod/2<br />
p.p.s. Можно попробовать добавить обновление по времени like top, и ограничить число выводимых процессов (например 20ю).</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/01/22/script-memory-usage-in-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

