<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Balyn Omavel: заметки с тегом zabbix</title>
<link>https://omavel.in/tags/zabbix/</link>
<description>Balyn Omavel</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.2 (v4116)</generator>

<itunes:subtitle>Balyn Omavel</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Как следить за изменением файлов в CentOS/RHEL через path units?</title>
<guid isPermaLink="false">1</guid>
<link>https://omavel.in/all/kak-sledit-za-izmeneniem-faylov-v-centos-rhel-cherez-path-units/</link>
<pubDate>Mon, 15 Jul 2019 11:23:47 +0400</pubDate>
<author></author>
<comments>https://omavel.in/all/kak-sledit-za-izmeneniem-faylov-v-centos-rhel-cherez-path-units/</comments>
<description>
&lt;p&gt;При запуске демона, systemd читает его конфигурацию из коллекции &lt;a href="https://www.freedesktop.org/software/systemd/man/systemd.unit.html"&gt;юнит-файлов&lt;/a&gt;. Есть специальные path-юниты, которые позволяют мониторить события, связанные с директориями и файлами. Если определенное событие наступает, запускается сервис-юнит.&lt;/p&gt;
&lt;p&gt;Допустим, мы хотим знать об изменениях файла &lt;tt&gt;test&lt;/tt&gt; в домашней директории.&lt;/p&gt;
&lt;p&gt;Создаем path-юнит &lt;tt&gt;/etc/systemd/system/example.path&lt;/tt&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[Unit]
Description=Monitor test file for changes
[Path]
PathChanged=/home/omavel/test
Unit=example.service
[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;tt&gt;&lt;b&gt;PathChanged&lt;/b&gt;&lt;/tt&gt; абсолютный путь до файла&lt;br /&gt;
&lt;tt&gt;&lt;b&gt;Unit&lt;/b&gt;&lt;/tt&gt; название сервис-юнита который мы опишем дальше, он будет запускаться при изменении файла. Можно не указывать, если название сервиса совпадает с path-юнитом (в приведенном примере они совпадают — &lt;i&gt;example&lt;/i&gt;.path, &lt;i&gt;example&lt;/i&gt;.service)&lt;br /&gt;
&lt;tt&gt;&lt;b&gt;WantedBy&lt;/b&gt;&lt;/tt&gt; юнит запускается в режиме multi-user операционной системы. Проверить можно командой&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;systemctl get-default&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Далее создаем сервис-юнит &lt;tt&gt;/etc/systemd/system/example.service&lt;/tt&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;[Unit]
Description=Executes script when a file has changed
[Service]
Type=simple
ExecStart=/home/omavel/script.sh
[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Заведем скрипт &lt;tt&gt;/home/omavel/script.sh&lt;/tt&gt;, который будет запускаться сервисом&lt;br /&gt;
Скрипт отмечает факт изменения файла в &lt;tt&gt;output.log&lt;/tt&gt;&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;#!/bin/bash
echo &amp;quot;`date` file changed&amp;quot; &amp;gt;&amp;gt; /home/omavel/output.log&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Сделаем скрипт исполняемым&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;chmod +x /home/omavel/script.sh&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Включим автоматический запуск обоих юнитов при загрузке и запустим path&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;systemctl enable example.{path,service}
systemctl start example.path&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Протестируем&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;echo &amp;gt; /home/omavel/test&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;В логе должна появиться новая строка&lt;br /&gt;
&lt;tt&gt;Mon Jul 15 10:15:20 MSK 2019 file changed&lt;/tt&gt;&lt;/p&gt;
&lt;h2&gt;Таким образом&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Path-юнит запущен всегда и следит за изменениями файла&lt;/li&gt;
&lt;li&gt;При наступлении события, он запускает сервис-юнит&lt;/li&gt;
&lt;li&gt;Сервис-юнит запускает скрипт (или что угодно)&lt;/li&gt;
&lt;li&gt;Скрипт пишет в лог (или куда угодно)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Ограничения&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Способ не подходит для мониторинга NFS, так как использует &lt;a href="http://man7.org/linux/man-pages/man7/inotify.7.html"&gt;inotyfy API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Что еще?&lt;/h2&gt;
&lt;ol start="1"&gt;
&lt;li&gt;В &lt;tt&gt;ExecStart&lt;/tt&gt; сервис-юнита можно сразу указывать бинарник с параметрами, например так я отправляю данные в Zabbix Trapper:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;ExecStart=/bin/zabbix_sender -z zabbix.server -s hostname -k itemkey -o &amp;quot;1&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="2"&gt;
&lt;li&gt;Помимо &lt;tt&gt;&lt;b&gt;PathChanged&lt;/b&gt;&lt;/tt&gt; &lt;a href="https://www.freedesktop.org/software/systemd/man/systemd.path.html"&gt;есть несколько других параметров&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</description>
</item>


</channel>
</rss>