<?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>jared.kiev.ua &#187; Скрипты</title>
	<atom:link href="http://jared.kiev.ua/tags/%d1%81%d0%ba%d1%80%d0%b8%d0%bf%d1%82%d1%8b/feed/" rel="self" type="application/rss+xml" />
	<link>http://jared.kiev.ua</link>
	<description>Сетап как стиль жизни</description>
	<lastBuildDate>Tue, 06 Dec 2011 13:58:43 +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>Поиск в логах Exim</title>
		<link>http://jared.kiev.ua/2011/12/exim-search-log/</link>
		<comments>http://jared.kiev.ua/2011/12/exim-search-log/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 13:58:43 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Exim]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Скрипты]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=259</guid>
		<description><![CDATA[<p>Часто бывает, что кто-то просит найти письмо такого-то пользователя, которое было отправлено позавчера, например. Можно перерывать логи руками, а можно воспользоваться скриптом, который любезно прислал один из читателей:</p>
<p><code>#!/bin/sh</p>
<p>to_grep="$*"</p>
<p>if [ ${#to_grep} = 0 ]<br />
then<br />
    echo "<br />
    STOP: Where is search string?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</code></p>
<p><a href="http://jared.kiev.ua/2011/12/exim-search-log/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>Часто бывает, что кто-то просит найти письмо такого-то пользователя, которое было отправлено позавчера, например. Можно перерывать логи руками, а можно воспользоваться скриптом, который любезно прислал один из читателей:</p>
<p><code>#!/bin/sh</p>
<p>to_grep="$*"</p>
<p>if [ ${#to_grep} = 0 ]<br />
then<br />
    echo "<br />
    STOP: Where is search string?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</p>
<p>tmp_major_filename="/tmp/searchmajortmp$$"<br />
rm -f "${tmp_major_filename}"</p>
<p># Мониторим Ctrl+C чтобы не оставлять хвостов из временных файлов.<br />
trap 'rm -f ${tmp_major_filename} ;echo ; exit 13' TERM INT</p>
<p>exlog_log="/var/log/exim/mainlog"</p>
<p>if [ ! -r "${exlog_log}" ]<br />
then<br />
    echo "<br />
        STOP: Where is exim log?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</p>
<p>today_is=`date +%Y-%m-%d`</p>
<p>echo "1" | awk -v today_is="${today_is}" -v rex_log="${exlog_log}" '{<br />
    dl_cn = 0                                   # устанавливаем счетчик дней в 0<br />
    # Получаем список файлов лога exim-a, считаем их количество.<br />
    cmd_get_file_list=("ls "rex_log"*")<br />
    while ((cmd_get_file_list |getline)> 0) {<br />
        ++fl_cn<br />
    }<br />
    close (cmd_get_file_list)</p>
<p>    # Узнаем что у нас за ОС<br />
    cmd_what_os=("uname -s")<br />
    cmd_what_os |getline os_is<br />
    close(cmd_what_os)</p>
<p>    while (dl_cn < fl_cn) {<br />
        # Получаем три значения в массиве (год, месяц, день) - текущая дата.<br />
        if (dl_cn == 0) {<br />
            split(today_is,TEMPTODAY,"-")<br />
            today_is_month = TEMPTODAY[2]<br />
            month_arg = TEMPTODAY[2]<br />
        } else {<br />
            cmd_month_arg = (today_is_month - month_arg)<br />
            # Получаем три значения в массиве (год, месяц, день) - последнее число нужного нам предыдущего месяца.<br />
            if (os_is == "FreeBSD" || os_is == "Darwin") {<br />
                cmd_date_last_month=("date -v-"cmd_day_arg"d -v-"cmd_month_arg"m +%Y-%m-%d")<br />
            } else {<br />
                cmd_date_last_month=("date -d \""cmd_day_arg" days ago "cmd_month_arg" months ago\" +%Y-%m-%d")<br />
            }<br />
            cmd_date_last_month |getline<br />
            split($0,TEMPTODAY,"-")<br />
            close (cmd_date_last_month)<br />
        }</p>
<p>        # Выясняем до какого числа месяца будем делать декремент.<br />
        days_until = (fl_cn - dl_cn)<br />
        if (days_until > 0) {<br />
            day_until = 1<br />
        } else {<br />
            day_until = days_until<br />
        }</p>
<p>        cmd_day_arg = TEMPTODAY[3]</p>
<p>        # Получаем список дат в нисходящем порядке, забиваем в массив.<br />
        for (tmp_td=TEMPTODAY[3];tmp_td>=day_until;tmp_td--) {<br />
            # Заодно пририсовываем нули для красоты.<br />
            if (length(tmp_td) == 1) {<br />
                day_number = ("0"tmp_td)<br />
            } else {<br />
                day_number = tmp_td<br />
            }<br />
            FILESLIST[++dl_cn] = (TEMPTODAY[1]"-"TEMPTODAY[2]"-"day_number)<br />
        }</p>
<p>        # Проверяем первая ли у нас итерация цикла.<br />
        if (month_arg != today_is_month) {<br />
            month_arg--<br />
        }<br />
        split("",TEMPTODAY)<br />
    }</p>
<p>    # Печать массива.<br />
    printf "\n"<br />
    for (xs=1;xs<=fl_cn;xs++) {<br />
        printf "\t%s%s%s\t%s\n" , "(", xs, ")", FILESLIST[xs]<br />
    }<br />
    split("",FILESLIST)<br />
        printf "\n\t"<br />
    exit<br />
}'</p>
<p>read -p "Enter Digit:   " num_to_grep</p>
<p>if [ ${#num_to_grep} = 0 ]<br />
then<br />
    echo "<br />
        STOP: Where is digit?<br />
" > /dev/stderr<br />
    exit 1<br />
fi</p>
<p>awk -v tmfname="${tmp_major_filename}" -v today_is="${today_is}" -v num_to_grep="${num_to_grep}" -v rex_log="${exlog_log}" -v to_grep="${to_grep}" '{<br />
    # Проверяем пользовательский ввод. Устанавливаем переменную w_show.<br />
    if ($0 ~ /^[1-3]$/) {<br />
        w_show=$0<br />
        exit<br />
    } else {<br />
        printf "\n\t%s\n\n", msg_wrong_number > err_log<br />
        split("",QUEUEARR)<br />
        split("",REJARRAY)<br />
        was_error = 1<br />
        exit 1<br />
    }<br />
} BEGIN {<br />
    q_cn = 0<br />
    r_cn = 0<br />
    err_log = "/dev/stderr"</p>
<p>    # Сообщения<br />
    msg_nothing_to_show = "STOP: Nothing to show."<br />
    msg_no_records = "STOP: No Records."<br />
    msg_wrong_number = "STOP: Wrong number."<br />
    msg_header_major = "SUCCESS"<br />
    msg_header_minor = "FAILURE"<br />
    msg_header_summ = "SUMMARY"</p>
<p>    # Паттерн очереди<br />
    patt_QUEbe = "^[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]-[A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9][A-Za-z0-9]-[A-Za-z0-9][A-Za-z0-9]$"</p>
<p>    # Получаем список файлов лога exim-a, добавляем их в массив, считаем их количество.<br />
    cmd_get_file_list=("ls "rex_log"*")<br />
    while ((cmd_get_file_list |getline)> 0) {<br />
        FILESLIST[++fl_cn] = $0<br />
    }<br />
    close (cmd_get_file_list)</p>
<p>    # Проверяем пользовательский ввод. Получаем имя файла, проверяем заархивирован ли он, устанавливаем необходимые переменные.<br />
    if (num_to_grep ~ /^[0-9]+$/ &#038;&#038; (num_to_grep <= fl_cn &#038;&#038; num_to_grep != 0)) {<br />
        ex_log = FILESLIST[num_to_grep]<br />
        tmpfilename_parts = split(FILESLIST[num_to_grep],TMPFILENAME,".")<br />
        if (TMPFILENAME[tmpfilename_parts] == "gz") {<br />
            first_grep = ("zgrep -ni \""to_grep"\" "ex_log)<br />
            second_grep = ("zgrep -f "tmfname" "ex_log)<br />
            pr_ex_log = ("zcat "ex_log)<br />
        } else {<br />
            first_grep = ("grep -ni \""to_grep"\" "ex_log)<br />
            second_grep = ("grep -f "tmfname" "ex_log)<br />
            pr_ex_log = ("cat "ex_log)<br />
        }<br />
        split("",TMPFILENAME)<br />
        split("",FILESLIST)<br />
    } else {<br />
        printf "\n\t%s\n\n", msg_wrong_number > err_log<br />
        was_error = 1<br />
        exit 1<br />
    }</p>
<p>    # Запускаем греп лога екзима. Если в строке в нужном месте есть совпадение с паттерном очереди, и это не реджект,<br />
    # добавляем очередь в массив очередей. Иначе номер строки лога в массив номеров строк лога.<br />
    while ((first_grep |getline)> 0) {<br />
        if (split($0,TMPLINE,":")>0) {<br />
            testqueue = substr(TMPLINE[4],4,16)<br />
            if (testqueue ~ patt_QUEbe) {<br />
                if (substr(TMPLINE[4],21,8) == "rejected") {<br />
                    REJARRAY[++r_cn] = TMPLINE[1]<br />
                } else if ((testqueue in QUEUEARR) == 0) {<br />
                    QUEUEARR[testqueue]<br />
                    ++q_cn<br />
                }<br />
            } else {<br />
                REJARRAY[++r_cn] = TMPLINE[1]<br />
            }</p>
<p>        }<br />
        split("",TMPLINE)<br />
    }<br />
    printf "\n"<br />
    close (first_grep)</p>
<p>        # Считаем и печатаем сколько мы всего нашли. Заодно приглашение ввода номера того что хочется увидеть если чего-то нашли.<br />
        printf "\t%s\t%s\t%s\n", "(1)", msg_header_major, q_cn<br />
        printf "\t%s\t%s\t%s\n", "(2)", msg_header_minor, r_cn<br />
        printf "\t%s\t%s\t%s\n", "(3)", msg_header_summ, (q_cn+r_cn)<br />
        if ((q_cn+r_cn) == 0) {<br />
            printf "\n\t%s\n\n", msg_nothing_to_show > err_log<br />
            split("",QUEUEARR)<br />
            split("",REJARRAY)<br />
            was_error = 1<br />
            exit 1<br />
        } else {<br />
            printf "\n\t%s\t" , "Enter Digit:"<br />
        }<br />
} END {<br />
    if (was_error == 1) {<br />
        exit 1<br />
    }</p>
<p>    # Получаем значение год-месяц-день из лога который будем показывать.<br />
    pr_ex_log | getline<br />
    close (pr_ex_log)<br />
    actdte = substr($0,1,10)</p>
<p>    # Устанавливаем переменные - элементы декора.<br />
    header_major = sprintf("%s%s%s%s%s", "-------------------------------- ",msg_header_major," ---------------------------------------- ",actdte," ----------------------")<br />
    header_minor = sprintf("%s%s%s%s%s", "-------------------------------- ",msg_header_minor," ---------------------------------------- ",actdte," ----------------------")<br />
    footer = sprintf("%s%s%s\n", "------------------------------------------------------------------------------- ",actdte," ----------------------")<br />
    splitter_completed = sprintf("%s", "+ ------------ c -- o -- m -- p -- l -- e -- t -- e -- d ---------------------- +")</p>
<p>    cmd_more = "more"</p>
<p>    # Пользователь возжелал увидеть очереди.<br />
    if (w_show == 1) {<br />
        if (q_cn == 0) {<br />
            split("",QUEUEARR)<br />
            split("",REJARRAY)<br />
            printf "\n\t%s\n\n", msg_no_records > err_log<br />
            exit 1<br />
        } else {<br />
            y = 1<br />
            z = 0<br />
            # Сбрасываем содержимое массива очередей во временный файл<br />
            for (tq in QUEUEARR) {<br />
                print (tq) >> tmfname<br />
            }<br />
            print(header_major)<br />
            # Грепаем лог екзима используя временный файл в качестве файла паттернов.<br />
            while ((second_grep |getline)> 0) {<br />
                if (length($0) == 46) {<br />
                    if (substr($0,38,9) == "Completed") {<br />
                        print (splitter_completed) | cmd_more<br />
                    } else {<br />
                        print(substr($0,12)) | cmd_more<br />
                    }<br />
                } else {<br />
                    print(substr($0,12)) | cmd_more<br />
                }<br />
            }<br />
            close (second_grep)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }</p>
<p>    # Пользователь возжелал увидеть отлупы.<br />
    } else if (w_show == 2) {<br />
        if (r_cn == 0) {<br />
            split("",QUEUEARR)<br />
            split("",REJARRAY)<br />
            printf "\n\t%s\n\n", msg_no_records > err_log<br />
            exit 1<br />
        } else {<br />
            y = 1<br />
            z = 0<br />
            print(header_minor)<br />
            while ((pr_ex_log |getline)> 0) {<br />
                z++<br />
                if(z == REJARRAY[y]){<br />
                    print(substr($0,12)) | cmd_more<br />
                    y++<br />
                }<br />
            }<br />
            close (pr_ex_log)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }</p>
<p>    # Пользователь возжелал увидеть все.<br />
    } else if (w_show == 3) {<br />
        if (r_cn != 0) {<br />
            y = 1<br />
            z = 0<br />
            print(header_minor)<br />
            while ((pr_ex_log |getline)> 0) {<br />
                z++<br />
                if(z == REJARRAY[y]){<br />
                    print(substr($0,12)) | cmd_more<br />
                    y++<br />
                }<br />
            }<br />
            close (pr_ex_log)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }<br />
        if (q_cn != 0) {<br />
            y = 1<br />
            z = 0<br />
            # Сбрасываем содержимое массива очередей во временный файл<br />
            for (tq in QUEUEARR) {<br />
                print (tq) >> tmfname<br />
            }<br />
            print(header_major)<br />
            # Грепаем лог екзима используя временный файл в качестве файла паттернов.<br />
            while ((second_grep |getline)> 0) {<br />
                if (length($0) == 46) {<br />
                    if (substr($0,38,9) == "Completed") {<br />
                        print (splitter_completed) | cmd_more<br />
                    } else {<br />
                        print(substr($0,12)) | cmd_more<br />
                    }<br />
                } else {<br />
                    print(substr($0,12)) | cmd_more<br />
                }<br />
            }<br />
            close (second_grep)<br />
            close (cmd_more)<br />
            print(footer)<br />
        }<br />
    }<br />
    split("",QUEUEARR)<br />
    split("",REJARRAY)<br />
}' -</p>
<p>rm -f "${tmp_major_filename}"</p>
<p># Настройки логгирования в конфиге exim:<br />
# --<br />
# log_file_path = /var/log/exim/exim_%s.log<br />
# write_rejectlog = no<br />
#<br />
# log_selector = \<br />
#    +all_parents \<br />
#    +connection_reject \<br />
#    -host_lookup_failed \<br />
#    -incoming_interface \<br />
#    -lost_incoming_connection \<br />
#    +received_sender \<br />
#    +received_recipients \<br />
#    +smtp_confirmation \<br />
#    +smtp_syntax_error \<br />
#    +smtp_protocol_error \<br />
#    -queue_run<br />
#<br />
# syslog_timestamp = yes<br />
#<br />
# --<br />
#<br />
# Ver 1.1<br />
#</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2011/12/exim-search-log/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Exim: чистим базу грейлистинга</title>
		<link>http://jared.kiev.ua/2010/02/exim-clear-greylist-base/</link>
		<comments>http://jared.kiev.ua/2010/02/exim-clear-greylist-base/#comments</comments>
		<pubDate>Fri, 05 Feb 2010 19:56:16 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Shell]]></category>
		<category><![CDATA[Почта]]></category>
		<category><![CDATA[Скрипты]]></category>
		<category><![CDATA[e-mail]]></category>
		<category><![CDATA[Exim]]></category>
		<category><![CDATA[Greylisting]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=192</guid>
		<description><![CDATA[<p>После публикации <a href="http://jared.kiev.ua/2010/01/isp-mailserver-1-exim/">статьи про экзим</a> принялись мне знакомые, отстроившие по ней сервера, говорить, мол грейлистовая база растет и конца-края ей нету. На самом деле ее вполне реально поддерживать в компактном и актуальном состоянии, в этом нам поможет простой скрипт, расположим его в каталоге /root/scripts и назовем exim-clear-greylist.sh:</p>
<p><a href="http://jared.kiev.ua/2010/02/exim-clear-greylist-base/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>После публикации <a href="http://jared.kiev.ua/2010/01/isp-mailserver-1-exim/">статьи про экзим</a> принялись мне знакомые, отстроившие по ней сервера, говорить, мол грейлистовая база растет и конца-края ей нету. На самом деле ее вполне реально поддерживать в компактном и актуальном состоянии, в этом нам поможет простой скрипт, расположим его в каталоге /root/scripts и назовем exim-clear-greylist.sh:</p>
<pre>#!/bin/sh
echo "DELETE FROM exim_greylist WHERE record_expires &lt; now();" | /usr/local/bin/mysql -u&lt;имя sql-пользователя&gt; -p&lt;пароль sql-пользователя&gt; &lt;название БД экзима&gt;
</pre>
<p>Теперь присвоим скрипту исполняемый бит:</p>
<pre># chmod 700 /root/scripts/exim-clear-greylist.sh
</pre>
<p>и добавим его запуск в /etc/crontab:</p>
<pre># echo "0       0       *       *       *       root    /root/scripts/exim-clear-greylist.sh" &gt;&gt; /etc/crontab
Все, теперь раз в сутки база будет очищаться от записей, у которых истек срок действия.
</pre>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/02/exim-clear-greylist-base/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Пишем SMS из Zabbix</title>
		<link>http://jared.kiev.ua/2010/02/sms-from-zabbix/</link>
		<comments>http://jared.kiev.ua/2010/02/sms-from-zabbix/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 14:06:56 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[Zabbix]]></category>
		<category><![CDATA[Мониторинг]]></category>
		<category><![CDATA[Скрипты]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[sms]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=180</guid>
		<description><![CDATA[<p>В последние несколько дней в нашей гермозоне регулярно творятся проблемы со светом. По состоянию на сейчас уже частично выжжена автоматика, отвечающая за включение генератора и он не включается. Т.к. новую автоматику привезут где-то в конце недели, то генератор пока приходится заводить ручками. Соответственно, от момента падения питания до момента включения генератора должно пройти не более получаса, которые держат упсы, и за эти самые полчаса надо как-то оповестить всех, кто может запустить генератор. Если днем публика читает почту, то ночью, как правило, хочет спать и ее надо будеть. Этим мы и займемся.</p>
<p><a href="http://jared.kiev.ua/2010/02/sms-from-zabbix/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p>В последние несколько дней в нашей гермозоне регулярно творятся проблемы со светом. По состоянию на сейчас уже частично выжжена автоматика, отвечающая за включение генератора и он не включается. Т.к. новую автоматику привезут где-то в конце недели, то генератор пока приходится заводить ручками. Соответственно, от момента падения питания до момента включения генератора должно пройти не более получаса, которые держат упсы, и за эти самые полчаса надо как-то оповестить всех, кто может запустить генератор. Если днем публика читает почту, то ночью, как правило, хочет спать и ее надо будеть. Этим мы и займемся.</p>
<p>По умолчанию Zabbix предлагает отправку SMS через GSM-модем, подключенный к zabbix-серверу, в моем случае такого нет, однако есть масса служб, которые предлагают отправку смс за деньги. Я остановился на сервисе turbosms.com.ua, вроде как самый недорогой, плюс имеет очевидный плюс &#8211; позволяет отправлять SMS простыми SQL-запросами к их MySQL-базе.</p>
<p>Будем считать, что сам заббикс у нас стоит (про его установку я как-нибудь напишу многабукаф, не в авральном режиме). Заходим в Administration &#8211; Media Types и жмем кнопку Create Media Type. Указываем любое удобное нам имя, тип Script и название скрипта. Сам скрипт при этом должен лежать в каталоге, определенном параметром AlertScriptsPath в /usr/local/etc/zabbix/zabbix_server.conf.</p>
<p>Скрипт в итоге получился такой (на perl):</p>
<pre>#!/usr/bin/perl

use strict;
use POSIX;
use DBI;

my $phone=@ARGV[0];
my $subj=@ARGV[1];
my $msg=@ARGV[2];

my $driver = "mysql";
my $user = "Mylogin";
my $password = "Mypassword";
my $database = "users";
my $dsn = "DBI:$driver:host=77.120.116.10:3306;database=$database";
my $dbh = DBI-&gt;connect($dsn, $user, $password);

my $sql = $dbh-&gt;prepare("INSERT INTO Mylogin (number, sign, message) VALUES ('$phone', 'MyISP', '$msg')");
$sql-&gt;execute;
</pre>
<p>Сделано по-быстрому, но работает.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/02/sms-from-zabbix/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Мониторинг и рестарт процессов</title>
		<link>http://jared.kiev.ua/2010/01/process-monitoring-restart/</link>
		<comments>http://jared.kiev.ua/2010/01/process-monitoring-restart/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 16:59:31 +0000</pubDate>
		<dc:creator>jared</dc:creator>
				<category><![CDATA[Shell]]></category>
		<category><![CDATA[Squid]]></category>
		<category><![CDATA[Скрипты]]></category>
		<category><![CDATA[Мониторинг]]></category>

		<guid isPermaLink="false">http://jared.kiev.ua/?p=166</guid>
		<description><![CDATA[<p style="text-align: justify;">Иногда случается, что какая-то софтина ведет себя непредсказуемо и периодически падает. А т.к. часто это бывает достаточно далеко и не всегда под рукой есть Интернет (да и не всегда можно на нужную машину достучаться снаружи), приходится изобретать велосипед. Можно городить какие-либо системы мониторинга а-ля Zabbix, например, но он достаточно громоздкий и смысл в нем не всегда есть, особенно на маленьких халтурках типа офисного гейтвея у небольшой конторы. Есть у меня несколько таких гейтвеев, на одном из них периодически падает squid по непонятной причине. Для того, чтоб не дергать его ручками, был написан следующий скрипт /root/scripts/check_squid.sh:</p>
<p><a href="http://jared.kiev.ua/2010/01/process-monitoring-restart/" class="more-link">Далее&#8230;</a></p>
]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Иногда случается, что какая-то софтина ведет себя непредсказуемо и периодически падает. А т.к. часто это бывает достаточно далеко и не всегда под рукой есть Интернет (да и не всегда можно на нужную машину достучаться снаружи), приходится изобретать велосипед. Можно городить какие-либо системы мониторинга а-ля Zabbix, например, но он достаточно громоздкий и смысл в нем не всегда есть, особенно на маленьких халтурках типа офисного гейтвея у небольшой конторы. Есть у меня несколько таких гейтвеев, на одном из них периодически падает squid по непонятной причине. Для того, чтоб не дергать его ручками, был написан следующий скрипт /root/scripts/check_squid.sh:</p>
<pre>#!/bin/sh

<span style="color: #000000;"># Переменные

# Строка, которая должна присутствовать в имени процесса
</span>process="usr/local/sbin/squid"

<span style="color: #000000;"># Строка, которая должна оттствовать в имени процесса
</span>process_exclude="grep"

<span style="color: #000000;"># Количество процессов, при котором надо делать рестарт
</span>process_number="0"

<span style="color: #000000;"># Команда для перезапуска
</span>restart_string="/usr/local/etc/rc.d/squid restart"

# Путь к ps
ps="/bin/ps"

# Путь к grep
grep="/usr/bin/grep"

if [ `$ps -ax | $grep $process | $grep -v $process_exclude | wc -l` -le "$process_number" ]
then
 echo $process is down, restarted!
 $restart_string
fi</pre>
<p style="text-align: justify;">Как видно, все достаточно просто, если количество процессов меньше или равно $process_number, выполняется $restart_string и выводится сообщение, которое позже придет к нам с ежедневным письмом-отчетом. Если с количеством процессов все хорошо, скрипт просто завершает свою работу. Для выполнения скрипта раз в 5 минут добавим в /etc/crontab строчку:</p>
<pre>*/5     *       *       *       *       root    /root/scripts/check_squid.sh
</pre>
<p>Вот и все, от себя добавлю, что этим способом можно мониторить и передергивать любые процессы, не только squid.</p>
]]></content:encoded>
			<wfw:commentRss>http://jared.kiev.ua/2010/01/process-monitoring-restart/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

