Категории

Показаны сообщения с ярлыком Linux. Показать все сообщения
Показаны сообщения с ярлыком Linux. Показать все сообщения

четверг, 24 марта 2016 г.

Centos 6 install python 2.7

Centos 6 install python2.7
yum install centos-release-SCL
yum install python27 python27-python-virtualenv
echo '/opt/rh/python27/root/usr/lib64' > /etc/ld.so.conf.d/python27.conf && ldconfig
virtualenv --prompt="(proj_name)" -p /opt/rh/python27/root/usr/lib/python2.7 .env
А вот так лучше не стоит делать:
yum install -y rubygems ruby-devel tar
gem install fpm
curl https://www.python.org/ftp/python/2.7.11/Python-2.7.11.tgz > Python-2.7.11.tgz
tar -xvf Python-2.7.11.tgz
cd Python-2.7.11
yum -y install openssl-devel readline-devel bzip2-devel sqlite-devel zlib-devel ncurses-devel db4-devel expat-devel
./configure --prefix=/usr/local --enable-unicode=ucs4 --enable-shared --enable-ipv6
make -j$(nproc)
test -d /tmp/python-2.7 || mkdir /tmp/python-2.7
make install DESTDIR=/tmp/python-2.7
echo '/sbin/ldconfig' > /tmp/python-2.7/run-ldconfig.sh
test -d /tmp/python-2.7/etc/ld.so.conf.d || mkdir /tmp/python-2.7/etc/ld.so.conf.d
echo '/usr/local/lib' > /tmp/python-2.7/etc/ld.so.conf.d/python27.conf

fpm -s dir -t rpm -n python27 -v 2.7.11_1 -C /tmp/python-2.7 \
  --after-install /tmp/python-2.7/run-ldconfig.sh \
  -d 'openssl' \
  -d 'bzip2' \
  -d 'zlib' \
  -d 'expat' \
  -d 'db4' \
  -d 'sqlite' \
  -d 'ncurses' \
  -d 'readline' \
  --directories=/usr/local/lib/python2.7/ \
  --directories=/usr/local/include/python2.7/ \
  usr/local etc
rpm конечно же соберется и даже все будет правильно и лучше, чем просто злобный make install, но python27 есть в официальных репозиториях и лучше ставить оттуда, это избавит от необходимости собирать другие пакеты, например python-virtualenv, python-pip и другие.

суббота, 5 марта 2016 г.

zabbix in linux

Problem:
root@host# LC_ALL=C su -m zabbix -c "ping ya.ru"
ping: icmp open socket: Operation not permitted
Solution:
sudo chmod u+s `which ping`


Problem:
sudo: sorry, you must have a tty to run sudo
Solution:
echo 'Defaults:zabbix !requiretty' | sudo tee -a /etc/sudoers.d/zabbix


Problem:
sudo: no tty present and no askpass program specified
Solution:
echo 'zabbix ALL=NOPASSWD:/usr/bin/nmap *' | sudo tee -a /etc/sudoers.d/zabbix

пятница, 15 января 2016 г.

PostgreSQL & MySQL создать базу и пользователя

Создать базу и пользователя в PostgreSQL, а так же установить пароль для этого пользователя:
sudo -u postgres psql
CREATE USER myuser WITH PASSWORD 'superpassword' CREATEDB;
CREATE DATABASE mydatabase WITH encoding='UNICODE' OWNER myuser;
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO myuser;
Сменить пароль уже существующему пользователю:
ALTER USER myuser PASSWORD 'superpassword';
Создать базу и пользователя в MySQL, а так же установить пароль для этого пользователя:
CREATE USER 'someuser'@'127.0.%.%' IDENTIFIED BY 'somepasswd';
CREATE DATABASE `somedb` CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON `somedb`.* TO 'someuser'@'10.135.%.%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

среда, 30 декабря 2015 г.

Ubuntu add-architecture i386 ia32-libs

В частности при попытке выполнить в командной строке файл, предназначенный для 32-х битной системы, может возникать ошибка вида:
./somefile: Нет такого файла или каталога (No such file or directory)
Чтобы 32-х битные приложения могли запускаться в 64-х битной системе Linux нужно установить соответствующие библиотеки, например для Ubuntu 14.04:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0
Удаление в обратном порядке:
sudo dpkg --remove-architecture i386
sudo apt-get update
sudo apt-get purge lib32z1 lib32ncurses5 lib32bz2-1.0

1. Multiarch: What happened to the ia32-libs package?

пятница, 18 декабря 2015 г.

Ubuntu prevent open thunderbird mailto links; xdg-open, xdg-mime, xdg-mail

Люблю выделять/копировать пароли/строки текста тройным ли двойным кликом мышки, но есть проблема со словами в которых есть символ @, Ubuntu распознает это как email адрес и запускает мне Thunderbird, что не желательно, недолго погуглив рамблером в яндексе нашел такой хак:
sudo sed -i '2 i exit 0' /usr/bin/xdg-email
Как легально отключить это поведение, через пользовательские настройки пока не нашел и остановился на этом варианте.

суббота, 10 октября 2015 г.

Centos7 LXC

Сборка из исходных кодов стабильной версии lxc для Centos 7 с поддержкой python. Поддержка python необходима, например для работы команды lxc-ls --fancy Установка зависимостей:
yum install -y epel-release
yum install -y gcc git rpm-build automake make python34 python34-devel
yum install -y libcap-devel docbook2X graphviz
Согласно официальному сайту на момент написания статьи доступно 3 версии LXC, я выбрал LTS stable-1.0
Скачивание исходных кодов:
git clone git://github.com/lxc/lxc -b stable-1.0
cd lxc
Почитав немного доку и исходники, получился такой порядок действий:
./autogen.sh

./configure --enable-python PYTHON=/usr/bin/python3.4 PYTHONDEV_CFLAGS=-I/usr/include/python-3.4m PYTHONDEV_LIBS=-l/usr/include/python-3.4m
Как можно заметить, конфигурация происходит с явным указанием версии python3.4, он появился сравнительно недавно в EPEL, его и будем использовать далее.

Т.к. у нас Centos и тут не все как у людей как в других дистрибутивах, изменим в исходниках путь до исполняемого файла Python, но сперва найдем файлы, которые нужно модифицировать:
grep -Rn '^#.*/python3'
В результате у меня получился такой небольшой скрипт:
for f in config/apparmor/lxc-generate-aa-rules.py src/lxc/lxc-device src/lxc/lxc-ls.in src/lxc/lxc-start-ephemeral.in src/lxc/lxc-ls src/lxc/lxc-start-ephemeral src/python-lxc/examples/api_test.py src/python-lxc/examples/pyconsole-vte.py src/python-lxc/examples/pyconsole.py src/python-lxc/setup.py src/python-lxc/setup.py.in; do
    sed -i 's|#!/usr/bin/python3|#!/usr/bin/python3.4|' $f
done

sed -i 's|Requires: python3|Requires: python34|' lxc.spec
sed -i 's|BuildRequires: python3-devel|BuildRequires: python34-devel|' lxc.spec
sed -i 's|/python3.3/site-packages/|/python3.4/site-packages/|' lxc.spec
После изменений проверим результат:
grep -Rn '^#.*/python3'
Теперь соберем rpm пакеты используя Python3.4:
make rpm PYTHON=/usr/bin/python3.4 PYTHONDEV_CFLAGS=-I/usr/include/python-3.4m PYTHONDEV_LIBS=-l/usr/include/python-3.4m
Найти собранные пакеты можно в каталоге cd /root/rpmbuild/RPMS/x86_64, а установить командой:
yum localinstall lxc-libs-1.0.7-1.el7.centos.x86_64.rpm lxc-1.0.7-1.el7.centos.x86_64.rpm
Не будем останавливаться на этом!
Для запуска Centos 7 контейнера необходимо проделать еще несколько манипуляций: В файле /usr/share/lxc/config/centos.common.conf нужно найти опцию lxc.cap.drop, содержащую значения setfcap и setpcap их нужно убрать, например для хоста Ubuntu 14.04 нужно сделать примерно так:
#lxc.cap.drop = mac_admin mac_override setfcap setpcap
lxc.cap.drop = mac_admin mac_override
Не зависимо от дистрибутива нужно в тот же файл еще добавить в конец сроки:
# This lets LXC SUSE containers run on hosts with apparmor.
# It does nothing on hosts which do not have apparmor enabled.
lxc.aa_profile = unconfined

# https://bugs.launchpad.net/ubuntu/+source/lxc/+bug/1347020
lxc.kmsg = 0

Ссылки по теме:
1. Bug 1176816 - booting a centos 7 container is extremely slow
2. centos 7 needs setpcap capability
3. systemd does not boot in a container
4. [lxc-devel] [PATCH] Various fixes for Fedora/CentOS/OpenSUSE templates and systemd.
5. big big login delays in CentOS 7 systemd #340
6. Linux Containers: Downloads
7. LXC 1.0: Troubleshooting and debugging [10/10]

четверг, 27 августа 2015 г.

Запуск X приложений на полный экран в X сервере без DM.

Для запуска в X сессии любой X программы можно воспользоваться nodm.
Установка необходимых пакетов:
$ sudo apt-get install nodm
Настройка nodm в файле /etc/default/nodm:
# nodm configuration

# Set NODM_ENABLED to something different than 'false' to enable nodm
NODM_ENABLED=true

# User to autologin for
NODM_USER=metall

# First vt to try when looking for free VTs
NODM_FIRST_VT='7'

### xinit program
###NODM_XINIT=/usr/bin/xinit

# X session
NODM_XSESSION=/etc/X11/Xsession

# Options for the X server
NODM_X_OPTIONS='-nolisten tcp'

# If an X session will run for less than this time in seconds, nodm will wait an
# increasing bit of time before restarting the session.
NODM_MIN_SESSION_TIME=60

Ссылки по теме:
1. forum kodi, XBMC Server

пятница, 24 июля 2015 г.

Ubuntu 14.04: Ускоряем работу Dash

На мой взгляд Unity Dash в Ubuntu перегружен лишним функционалом, например искать файлы удобнее в Nautilus, а приложения, доступные для установки лучше искать в Software Center, и самое важное выполнять онлайн поиск лучше в браузере. А вот установленные приложения вполне удобно искать в Dash.
Скрипт ниже выключает онлайн поиск и все линзы, кроме установленных приложений.
Код скрипта disable_all_scopes_enable_listed.sh:
#!/bin/sh

[ $(id -u) -eq 0 ] && echo 'Please run from NOT root user!' && exit 1

# Delete unwanted packages.
sudo apt-get purge -y unity-lens-shopping unity-lens-friends unity-scope-video-remote unity-lens-music unity-lens-photos unity-webapps-common

# Disable online search.
gsettings set com.canonical.Unity.Lenses remote-content-search none

# Manually remove the link from dash.
sudo rm /usr/share/applications/ubuntu-amazon-default.desktop

get_application() {
 find /usr/share/unity/scopes/ \( \
   -name "*.scope" \
   -not -name 'applications.scope' \
  \) -printf "'%P'," | sed 's/\//-/g;s/,$//'
}

# Disabling the scopes.
gsettings set com.canonical.Unity.Lenses disabled-scopes "[$(get_application)]"
gsettings get com.canonical.Unity.Lenses disabled-scopes

gsettings set com.canonical.Unity.Lenses always-search "['applications.scope']"
gsettings set com.canonical.Unity.Dash scopes "['home.scope', 'applications.scope']"

# Disable available apps.
gsettings set com.canonical.Unity.ApplicationsLens display-available-apps "false"
Посмотреть что еще можно покрутить в Unity на свой вкус можно простой командой:
gsettings list-recursively | grep Unity
Названия опций и их значения вполне интуитивно понятные, можно быстро разобраться что к чему.
Например отключить показ доступных приложений:
gsettings set com.canonical.Unity.ApplicationsLens display-available-apps "false"
Проверить результат можно так:
gsettings get com.canonical.Unity.ApplicationsLens display-available-apps
Сбросить настройки на дефолт можно например так:
gsettings reset-recursively com.canonical.Unity.Dash

1. How can I remove Amazon search results from the dash or disable the feature?
2. Remove unsafe packages from Ubuntu

понедельник, 15 июня 2015 г.

Ubuntu 14.04 Rhythmbox перестал реагировать на кнопки в indicator-sound

Столкнулся с проблемой, перестал работать индикатор звука в Ubuntu 14.04, а именно кнопка Play/Pause в Rhythmbox, поискал в интернете подобные проблемы и кое-что нашел:
$ gdbus call --session --dest org.mpris.MediaPlayer2.rhythmbox --object-path /org/mpris/MediaPlayer2 --method org.freedesktop.DBus.Properties.GetAll 'org.mpris.MediaPlayer2.Player'
Ошибка: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.mpris.MediaPlayer2.rhythmbox was not provided by any .service files
Как оказалось, я копался в плагинах Rhythmbox и отключил Интерфейс MPRIS D-Bus, не зная для чего он, но теперь я узнал зачем он нужен из [ 2 ] и включил, после чего индикатор заработал в штатном режиме.

1. vlc sound menu integration broken 14.04
2. Rhythmbox controls and track info broken

понедельник, 1 июня 2015 г.

Zabbix: TCP connections

Скрипты и файлы конфигурации для мониторинга состояния TCP соединений.

Шаблон для zabbix:


    2.0
    2015-05-31T06:58:27Z
    
        
            Linux servers
        
    
    
        
    
    
        
            {Template UnixTcp:tcp.establ.last(0)}>10000
            Too many ESTABLISHED connections on {HOST.NAME}
            
            0
            3
            
            0
            
        
        
            {Template UnixTcp:tcp.timew.last(0)}>30000
            Too many TIME_WAIT connections on {HOST.NAME}
            
            0
            3
            
            0
            
        
    
    
        
            TCP Connections
            900
            200
            0.0000
            100.0000
            1
            1
            1
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    6
                    1
                    009900
                    0
                    2
                    0
                    
                        Template UnixTcp
                        tcp.establ
                    
                
                
                    3
                    1
                    9999FF
                    0
                    2
                    0
                    
                        Template UnixTcp
                        tcp.closew
                    
                
                
                    0
                    1
                    3333FF
                    0
                    2
                    0
                    
                        Template UnixTcp
                        tcp.timew
                    
                
                
                    5
                    1
                    DDDD00
                    0
                    2
                    0
                    
                        Template UnixTcp
                        tcp.synrecv
                    
                
                
                    1
                    1
                    FFFF66
                    0
                    2
                    0
                    
                        Template UnixTcp
                        tcp.listen
                    
                
                
                    4
                    1
                    BBBB00
                    0
                    2
                    0
                    
                        Template UnixTcp
                        tcp.synsent
                    
                
                
                    2
                    1
                    DDDDDD
                    0
                    2
                    0
                    
                        Template UnixTcp
                        tcp.finw1
                    
                
                
                    1
                    1
                    CCCCCC
                    0
                    2
                    0
                    
                        Template UnixTcp
                        tcp.finw2
                    
                
            
        
    

Для удобства установки различных нестандартных метрик для мониторинга я использую директиву Include=/etc/zabbix/zabbix_agentd.conf.d/ после чего можно добавлять отдельные файлы, в которых будут все опции, необходимые для работы необходимой метрики, в данном случае: /etc/zabbix/zabbix_agentd.conf.d/tcp_status.conf:
UserParameter=tcp.all,/etc/zabbix/scripts/tcp_status.sh
Теперь создадим скрипт, который осуществляет доставку данных в zabbix - /etc/zabbix/scripts/tcp_status.sh:
#!/bin/sh

# WARNING: Correctly setup 'Hostname=' in config is REQUIRED!

/usr/bin/env ss -ant | \
 awk '{
  if (NR>1) {
   state[$1]++;
  }
 }
 END {
  for (i in state) {
   s=i;
   sub(/ESTAB/, "establ", s);
   sub(/LISTEN/, "listen", s);
   sub(/SYN-SENT/, "synsent", s);
   sub(/SYN-RECV/, "synrecv", s);
   sub(/FIN-WAIT-1/, "finw1", s);
   sub(/FIN-WAIT-2/, "finw2", s);
   sub(/CLOSE-WAIT/, "closew", s);
   sub(/TIME-WAIT/, "timew", s);
   print "- tcp."s, state[i]
  }
 }' | /usr/bin/env zabbix_sender \
 --config /etc/zabbix/zabbix_agentd.conf \
 --input-file - >/dev/null 2>&1
echo $?
exit 0
И сразу выставляем правильные права на скрипт:
chmod 755 /etc/zabbix/scripts/tcp_status.sh
chown zabbix:zabbix /etc/zabbix/scripts/tcp_status.sh
Если каталога /etc/zabbix/scripts у вас еще нет, то его нужно создать:
mkdir /etc/zabbix/scripts
chmod 755 /etc/zabbix/scripts
chown zabbix:zabbix /etc/zabbix/scripts
Стоит отметить тот факт, что в скрипте используется ss (из пакета iproute2), вместо netstat, замеры и опыт использования показал, что ss быстрее. Все почти готово, теперь можно зайти в панель zabbix и добавить нужному хосту новый шаблон Template UnixTcp.

воскресенье, 31 мая 2015 г.

zabbix: мониторинг nginx status.

Скрипты и файлы конфигурации для мониторинга состояния nginx.

Шаблон для zabbix 2.2:


    2.0
    2015-11-07T18:31:03Z
    
        
            Templates
        
    
    
        
    
    
        
            {Template App nginx:proc.num[nginx].last(0)}=0
            Nginx is down on {HOST.NAME}
            
            0
            4
            
            0
            
        
        
            {Template App nginx:nginx.ping[{HOST.HOST}].min(#10)}>0.01
            Nginx is slow to respond on {HOST.NAME}
            
            0
            2
            
            0
            
        
        
            {Template App nginx:nginx.ping[{HOST.HOST}].last()}<0
            Nginx response is invalid on {HOST.NAME}
            
            0
            3
            Nginx is not available via configured url
            0
            
        
    
    
        
            Nginx ping
            900
            200
            0.0000
            100.0000
            1
            1
            0
            1
            0
            0.0000
            0.0000
            1
            0
            0
            0
            
                
                    0
                    2
                    009900
                    0
                    2
                    0
                    
                        Template App nginx
                        nginx.ping[{HOST.HOST}]
                    
                
            
        
        
            Nginx status
            900
            200
            0.0000
            100.0000
            0
            0
            0
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    1
                    0
                    FF3333
                    0
                    2
                    0
                    
                        Template App nginx
                        nginx.connections.writing
                    
                
                
                    0
                    0
                    009900
                    0
                    2
                    0
                    
                        Template App nginx
                        nginx.connections.active
                    
                
                
                    3
                    0
                    0000FF
                    0
                    2
                    0
                    
                        Template App nginx
                        nginx.connections.reading
                    
                
                
                    2
                    0
                    FF33FF
                    0
                    2
                    0
                    
                        Template App nginx
                        nginx.connections.waiting
                    
                
            
        
        
            Nginx workload
            900
            200
            0.0000
            100.0000
            1
            1
            0
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    2
                    0
                    009900
                    0
                    2
                    0
                    
                        Template App nginx
                        nginx.accepts
                    
                
                
                    0
                    0
                    C80000
                    0
                    2
                    0
                    
                        Template App nginx
                        nginx.requests
                    
                
                
                    1
                    0
                    3333FF
                    0
                    2
                    0
                    
                        Template App nginx
                        nginx.handled
                    
                
            
        
    
Шаблон для zabbix 2.4:


    2.0
    2015-05-31T06:58:40Z
    
        
            Templates
        
    
    
        
    
    
        
            {Template APP nginx:proc.num[nginx].last(0)}=0
            Nginx is down on {HOST.NAME}
            
            0
            4
            
            0
            
        
        
            {Template APP nginx:nginx.ping[{HOST.HOST}].min(#10)}>0.01
            Nginx is slow to respond on {HOST.NAME}
            
            0
            2
            
            0
            
        
        
            {Template APP nginx:nginx.ping[{HOST.HOST}].last()}<0
            Nginx responce is invalid on {HOST.NAME}
            
            0
            3
            Nginx is not available via configured url
            0
            
        
    
    
        
            Nginx ping
            900
            200
            0.0000
            100.0000
            1
            1
            0
            1
            0
            0.0000
            0.0000
            1
            0
            0
            0
            
                
                    0
                    2
                    009900
                    0
                    2
                    0
                    
                        Template APP nginx
                        nginx.ping[{HOST.HOST}]
                    
                
            
        
        
            Nginx status
            900
            200
            0.0000
            100.0000
            0
            0
            0
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    1
                    0
                    FF3333
                    0
                    2
                    0
                    
                        Template APP nginx
                        nginx.connections.writing
                    
                
                
                    0
                    2
                    009900
                    0
                    2
                    0
                    
                        Template APP nginx
                        nginx.connections.active
                    
                
                
                    2
                    0
                    FF33FF
                    0
                    2
                    0
                    
                        Template APP nginx
                        nginx.connections.waiting
                    
                
                
                    3
                    0
                    0000FF
                    0
                    2
                    0
                    
                        Template APP nginx
                        nginx.connections.reading
                    
                
            
        
        
            Nginx workload
            900
            200
            0.0000
            100.0000
            1
            1
            0
            1
            0
            0.0000
            0.0000
            0
            0
            0
            0
            
                
                    2
                    0
                    009900
                    0
                    2
                    0
                    
                        Template APP nginx
                        nginx.accepts
                    
                
                
                    1
                    0
                    3333FF
                    0
                    2
                    0
                    
                        Template APP nginx
                        nginx.handled
                    
                
                
                    0
                    0
                    FF0000
                    0
                    2
                    0
                    
                        Template APP nginx
                        nginx.requests
                    
                
            
        
    

Для удобства установки различных нестандартных метрик для мониторинга я использую директиву Include=/etc/zabbix/zabbix_agentd.conf.d/ после чего можно добавлять отдельные файлы, в которых будут все опции, необходимые для работы необходимой метрики, в данном случае: /etc/zabbix/zabbix_agentd.conf.d/nginx_status.conf:
UserParameter=nginx.ping,sh /etc/zabbix/scripts/nginx_status.sh
Конфигурация для nginx файл nginx_status_http.conf:
server {
 listen 127.0.0.1:80;
 server_name localhost;

 keepalive_timeout 0;
 location = /nginx_status {
  stub_status on;
#  access_log off;

  allow 127.0.0.1;
  deny all;
 }

 access_log /var/log/nginx/nginx_status_http.access.log;
 error_log /var/log/nginx/nginx_status_http.error.log;
}
Нужно положить этот конфигурационный файл nginx в /etc/nginx/sites-available/nginx_status_http.conf:
ln -s /etc/nginx/sites-available/nginx_status_http.conf /etc/nginx/sites-enabled/nginx_status_http.conf
service nginx reload
Затем необходимо создать скрипт, который осуществляет доставку данных в zabbix - /etc/zabbix/scripts/nginx_status.sh:
#!/bin/sh

URL='http://localhost/nginx_status'
TMP='/tmp/nginx-ping.tmp'
ZABBIX_SENDER='/usr/bin/env zabbix_sender'
CONFIG='/etc/zabbix/zabbix_agentd.conf'

# WARNING: Correctly setup 'Hostname=' in config is REQUIRED!
# REQUIRED binaries: GNU time, wget, awk, zabbix_sender.

(/usr/bin/env time -f %e /usr/bin/env wget --no-http-keep-alive --quiet --timeout 9 -O - $URL) 2>$TMP | \
awk '/Active connections/ {active=int($NF)}
 / ([0-9]+) ([0-9]+) ([0-9]+)/ {accepts=int($1); handled=int($2); requests=int($3)}
 /Reading:/ {reading=int($2); writing=int($4); waiting=int($6)}
 END {
  print "- nginx.connections.active", active;
  print "- nginx.connections.reading", reading;
  print "- nginx.connections.writing", writing;
  print "- nginx.connections.waiting", waiting;

  print "- nginx.accepts", accepts;
  print "- nginx.handled", handled;
  print "- nginx.requests", requests;
 }' | $ZABBIX_SENDER \
 --config $CONFIG \
 --input-file - >/dev/null 2>&1

[ -f $TMP ] && cat $TMP && rm $TMP

exit 1
И сразу выставляем правильные права на скрипт:
chmod 600 /etc/zabbix/scripts/nginx_status.sh
chown zabbix:zabbix /etc/zabbix/scripts/nginx_status.sh
Если каталога /etc/zabbix/scripts у вас еще нет, то его нужно создать:
mkdir /etc/zabbix/scripts
chmod 700 /etc/zabbix/scripts
chown zabbix:zabbix /etc/zabbix/scripts
Для корректной работы необходимо вызывать напрямую бинарный файл /usr/bin/time, не путать со встроенной bash функцией time, в Linux есть с этим большая, на мой взгляд, проблема, т.к. bash time работает некорректно, в отличие от /usr/bin/time, к тому же и формат ответа разный, установить можно: Для Ubuntu, debian:
apt-get install time
Для CentoOS и подобных:
yum install time
Все почти готово, теперь можно зайти в панель zabbix и добавить нужному хосту новый шаблон Template APP nginx.
1. Github repo:zabbix_nginx

среда, 8 апреля 2015 г.

Ubuntu 14.04 LTS php5-fpm reload logrotate

При установке php-fpm под Ubuntu 14.04 обнаружились проблемы с логами, не работала ротация, а так же не работал reload демона, демон завершал master процесс, при этом оставляя свои дочерние процессы, в следствие чего дальнейшая работа с php-fpm становилась невозможной, без ручной остановки каждого процесса php-fpm и последующим запуском, в общем надоело это безобразие, решил навести порядок.

Создаем папку для логов:
mkdir /var/log/php5-fpm
chmod 777 /var/log/php5-fpm
chmod 777 сделан намерено, потому, что у меня php-fpm пулы запускаются от разных пользователей и от разных групп.

Затем переложим лог ошибок php-fpm в созданную только что папку с логами, для этого в файле: /etc/php5/fpm/php-fpm.conf:
error_log = /var/log/php5-fpm/error.log
Теперь займемся правильной ротацией логов, файл /etc/logrotate.d/php5-fpm к такому виду:
/var/log/php5-fpm/*.log {
        rotate 5
#       weekly  # Не стоит терять логи, обнуляя файл раз в неделю!
        size 1k
        missingok
        notifempty
        compress
        delaycompress
        postrotate
                # http://stackoverflow.com/questions/19998526/ubuntu-php5-fpm-throws-unknown-instance-on-reload
                # The original reload command did never work
                #invoke-rc.d php5-fpm reopen-logs > /dev/null

                # Workaround for cases when the reload command fails for some reason
                service php5-fpm reload > /dev/null 2>&1
                [ $? = 0 ] || ( service php5-fpm stop; killall php5-fpm; service php5-fpm start ) > /dev/null
        endscript
}
Так же рекомендую привести в порядок логи каждого пула например для пула www в файле /etc/php5/fpm/pool.d/www.conf:
access.log = /var/log/php5-fpm/$pool-access.log
slowlog = /var/log/php5-fpm/$pool-slow.log
php_admin_value[error_log] = /var/log/php5-fpm/$pool-error.log
php_admin_flag[log_errors] = on
Обратите внимание в имени файла используется переменная $pool, которая позволяет избавиться от рутины, прописывания имени пула в каждой строчке в каждом пуле.

Теперь решим проблему с reload и с удобным хранением php-fpm пулов приводим файл /etc/init/php5-fpm.conf к такому виду:
# php5-fpm - The PHP FastCGI Process Manager

description "The PHP FastCGI Process Manager"
author "Ondřej Surý "

start on runlevel [2345]
stop on runlevel [016]

# Precise upstart does not support reload signal, and thus rejects the
# job. We'd rather start the daemon, instead of forcing users to
# reboot https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1272788
#
reload signal USR2

pre-start script
        [ -d /var/run/php5-fpm ] || install -m 777 -o www-data -g root -d /var/run/php5-fpm
        /usr/lib/php5/php5-fpm-checkconf
end script

respawn
exec /usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf
Для применения изменений в upstart, необходимо выполнить команды, подробнее [ 2 ]:
root@Ubuntu# initctl reload-configuration
root@Ubuntu# initctl stop php5-fpm
initctl: Unknown instance: 
root@Ubuntu# initctl start php5-fpm
php5-fpm start/running, process 18467
В файле /etc/init.d/php5-fpm, добавим вверху, после переменной SCRIPTNAME строчку:
SOCKETDIR=/var/run/$NAME
А затем, внутри функции "do_start() {" добавим еще одну строчку:
[ -d $SOCKETDIR ] || install -m 777 -o www-data -g root -d $SOCKETDIR
-m 777 я указал намеренно, как я уже упоминал ранее, у меня php-fpm пулы запускаются от разных uid:gid

Итак после всего этого:
  • Сокеты пулов лежат в ожидаемом месте: /var/run/php5-fpm/
  • Логи пулов, и лог ошибок демона php-fpm в: /var/log/php5-fpm/
  • Логи не обнуляются раз в неделю, а ротация логов производится при достижении размера файла в 1Кб и главное она работает!
  • Команда service php5-fpm reload теперь ничего не ломает и работает корректно.

1. Ubuntu php5-fpm throws unknown instance on reload
2. Автоматическое создание директории /var/run/php5-fpm после перезагрузки

вторник, 17 марта 2015 г.

Zabbix: supervisord автообнаружение программ и мониторинг статуса.

Скрипт поддерживает обнаружение (discovery) всех программ, которые сконфигурированы для запуска.
Отправка данных осуществляется через zabbix_sender.
Установка довольно тривиальна:
mkdir /etc/zabbix/scripts
chown root:zabbix -R /etc/zabbix/scripts
chmod 750 /etc/zabbix/scripts
Код скрипта /etc/zabbix/scripts/lsimegaraid_discovery_trapper.sh:
#!/bin/sh

ZABBIX_SENDER='/usr/bin/env zabbix_sender'
ZBX_CONFIG='/etc/zabbix/zabbix_agentd.conf'
ZBX_HOSTNAME=$(awk -F'=' '/^Hostname=/{ print $2 }' /etc/zabbix/zabbix_agentd.d/*.conf)

supervisorctl status | \
 awk 'match($0, /^([^:]+):[^[:blank:]]+[[:blank:]]+([^[:blank:]]+).*$/, line) {
  SUBSEP=","
  # Sadly, we can not initialize all the worker,status couples in the BEGIN section.
  # We have to run these almost useless lines during the input parsing
  if (status[line[1],"STOPPED"]  == 0) {status[line[1],"STOPPED"]  = 0}
  if (status[line[1],"STARTING"] == 0) {status[line[1],"STARTING"] = 0}
  if (status[line[1],"RUNNING"]  == 0) {status[line[1],"RUNNING"]  = 0}
  if (status[line[1],"BACKOFF"]  == 0) {status[line[1],"BACKOFF"]  = 0}
  if (status[line[1],"STOPPING"] == 0) {status[line[1],"STOPPING"] = 0}
  if (status[line[1],"EXITED"]   == 0) {status[line[1],"EXITED"]   = 0}
  if (status[line[1],"FATAL"]    == 0) {status[line[1],"FATAL"]    = 0}
  if (status[line[1],"UNKNOWN"]  == 0) {status[line[1],"UNKNOWN"]  = 0}
  status[line[1],line[2]]++
 }
 END {
  for(i in status) {
   print "- supervisord.workerState[" i "] " status[i]
  }
 }' | /usr/bin/env zabbix_sender --config $ZBX_CONFIG \
  --input-file - --host $ZBX_HOSTNAME >/dev/null 2>&1
echo $?
exit 0
Установка прав на скрипт:
chown root:zabbix /etc/zabbix/scripts/supervisord_discovery_trapper.sh
chmod 750 /etc/zabbix/scripts/supervisord_discovery_trapper.sh
Не забываем про настройки в скрипте, где нужно указать полные пути до необходимых программ и конфигурационных файлов:
ZABBIX_SENDER='/usr/bin/env zabbix_sender'
ZBX_CONFIG='/etc/zabbix/zabbix_agentd.conf'
ZBX_HOSTNAME=$(awk -F'=' '/^Hostname=/{ print $2 }' /etc/zabbix/zabbix_agentd.d/*.conf)
Конфигурационный файл: /etc/zabbix/zabbix_agentd.conf.d/lsimegaraid.conf
AllowRoot=1
UserParameter=supervisord.discovery,supervisorctl status | awk 'BEGIN {out="{\n\t\"data\":[\n"; f=0;} {match($0, /^([^:]+):[^[:blank:]]+[[:blank:]]+([^[:blank:]]+).*$/, line);if (!seen[line[1]]++ && line[1] != NULL) {if (f == 1) out=out",\n";out=out "\t\t{\"{#PROGRAMM}\":\""line[1]"\"}";f=1}} END{ if(f == 0){print "{}"}else{print out"\n\t]\n}"}}'
UserParameter=supervisord.trapper,/etc/zabbix/scripts/supervisord_trapper.sh
Шаблон для zabbix:
<?xml version="1.0" encoding="UTF-8"?>
<zabbix_export>
    <version>2.0</version>
    <date>2015-03-17T09:01:18Z</date>
    <groups>
        <group>
            <name>Templates</name>
        </group>
    </groups>
    <templates>
        <template>
            <template>Template_APP supervisor</template>
            <name>Template_APP supervisor</name>
            <description/>
            <groups>
                <group>
                    <name>Templates</name>
                </group>
            </groups>
            <applications>
                <application>
                    <name>App supervisord</name>
                </application>
            </applications>
            <items>
                <item>
                    <name>Controller</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>supervisord.trapper</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>App supervisord</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
                <item>
                    <name>Supervisord process count</name>
                    <type>0</type>
                    <snmp_community/>
                    <multiplier>0</multiplier>
                    <snmp_oid/>
                    <key>proc.num[supervisord]</key>
                    <delay>30</delay>
                    <history>90</history>
                    <trends>365</trends>
                    <status>0</status>
                    <value_type>3</value_type>
                    <allowed_hosts/>
                    <units/>
                    <delta>0</delta>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <formula>1</formula>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <data_type>0</data_type>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <description/>
                    <inventory_link>0</inventory_link>
                    <applications>
                        <application>
                            <name>App supervisord</name>
                        </application>
                    </applications>
                    <valuemap/>
                    <logtimefmt/>
                </item>
            </items>
            <discovery_rules>
                <discovery_rule>
                    <name>supervisord State discovery</name>
                    <type>0</type>
                    <snmp_community/>
                    <snmp_oid/>
                    <key>supervisord.discovery</key>
                    <delay>3600</delay>
                    <status>0</status>
                    <allowed_hosts/>
                    <snmpv3_contextname/>
                    <snmpv3_securityname/>
                    <snmpv3_securitylevel>0</snmpv3_securitylevel>
                    <snmpv3_authprotocol>0</snmpv3_authprotocol>
                    <snmpv3_authpassphrase/>
                    <snmpv3_privprotocol>0</snmpv3_privprotocol>
                    <snmpv3_privpassphrase/>
                    <delay_flex/>
                    <params/>
                    <ipmi_sensor/>
                    <authtype>0</authtype>
                    <username/>
                    <password/>
                    <publickey/>
                    <privatekey/>
                    <port/>
                    <filter>
                        <evaltype>0</evaltype>
                        <formula/>
                        <conditions/>
                    </filter>
                    <lifetime>30</lifetime>
                    <description/>
                    <item_prototypes>
                        <item_prototype>
                            <name>supervisord BACKOFF State of worker $1</name>
                            <type>2</type>
                            <snmp_community/>
                            <multiplier>0</multiplier>
                            <snmp_oid/>
                            <key>supervisord.workerState[{#PROGRAMM},BACKOFF]</key>
                            <delay>0</delay>
                            <history>7</history>
                            <trends>365</trends>
                            <status>0</status>
                            <value_type>3</value_type>
                            <allowed_hosts/>
                            <units/>
                            <delta>0</delta>
                            <snmpv3_contextname/>
                            <snmpv3_securityname/>
                            <snmpv3_securitylevel>0</snmpv3_securitylevel>
                            <snmpv3_authprotocol>0</snmpv3_authprotocol>
                            <snmpv3_authpassphrase/>
                            <snmpv3_privprotocol>0</snmpv3_privprotocol>
                            <snmpv3_privpassphrase/>
                            <formula>1</formula>
                            <delay_flex/>
                            <params/>
                            <ipmi_sensor/>
                            <data_type>0</data_type>
                            <authtype>0</authtype>
                            <username/>
                            <password/>
                            <publickey/>
                            <privatekey/>
                            <port/>
                            <description/>
                            <inventory_link>0</inventory_link>
                            <applications>
                                <application>
                                    <name>App supervisord</name>
                                </application>
                            </applications>
                            <valuemap/>
                            <logtimefmt/>
                        </item_prototype>
                        <item_prototype>
                            <name>supervisord EXITED State of worker $1</name>
                            <type>2</type>
                            <snmp_community/>
                            <multiplier>0</multiplier>
                            <snmp_oid/>
                            <key>supervisord.workerState[{#PROGRAMM},EXITED]</key>
                            <delay>0</delay>
                            <history>7</history>
                            <trends>365</trends>
                            <status>0</status>
                            <value_type>3</value_type>
                            <allowed_hosts/>
                            <units/>
                            <delta>0</delta>
                            <snmpv3_contextname/>
                            <snmpv3_securityname/>
                            <snmpv3_securitylevel>0</snmpv3_securitylevel>
                            <snmpv3_authprotocol>0</snmpv3_authprotocol>
                            <snmpv3_authpassphrase/>
                            <snmpv3_privprotocol>0</snmpv3_privprotocol>
                            <snmpv3_privpassphrase/>
                            <formula>1</formula>
                            <delay_flex/>
                            <params/>
                            <ipmi_sensor/>
                            <data_type>0</data_type>
                            <authtype>0</authtype>
                            <username/>
                            <password/>
                            <publickey/>
                            <privatekey/>
                            <port/>
                            <description/>
                            <inventory_link>0</inventory_link>
                            <applications>
                                <application>
                                    <name>App supervisord</name>
                                </application>
                            </applications>
                            <valuemap/>
                            <logtimefmt/>
                        </item_prototype>
                        <item_prototype>
                            <name>supervisord FATAL State of worker $1</name>
                            <type>2</type>
                            <snmp_community/>
                            <multiplier>0</multiplier>
                            <snmp_oid/>
                            <key>supervisord.workerState[{#PROGRAMM},FATAL]</key>
                            <delay>0</delay>
                            <history>7</history>
                            <trends>365</trends>
                            <status>0</status>
                            <value_type>3</value_type>
                            <allowed_hosts/>
                            <units/>
                            <delta>0</delta>
                            <snmpv3_contextname/>
                            <snmpv3_securityname/>
                            <snmpv3_securitylevel>0</snmpv3_securitylevel>
                            <snmpv3_authprotocol>0</snmpv3_authprotocol>
                            <snmpv3_authpassphrase/>
                            <snmpv3_privprotocol>0</snmpv3_privprotocol>
                            <snmpv3_privpassphrase/>
                            <formula>1</formula>
                            <delay_flex/>
                            <params/>
                            <ipmi_sensor/>
                            <data_type>0</data_type>
                            <authtype>0</authtype>
                            <username/>
                            <password/>
                            <publickey/>
                            <privatekey/>
                            <port/>
                            <description/>
                            <inventory_link>0</inventory_link>
                            <applications>
                                <application>
                                    <name>App supervisord</name>
                                </application>
                            </applications>
                            <valuemap/>
                            <logtimefmt/>
                        </item_prototype>
                        <item_prototype>
                            <name>supervisord RUNNING State of worker $1</name>
                            <type>2</type>
                            <snmp_community/>
                            <multiplier>0</multiplier>
                            <snmp_oid/>
                            <key>supervisord.workerState[{#PROGRAMM},RUNNING]</key>
                            <delay>0</delay>
                            <history>7</history>
                            <trends>365</trends>
                            <status>0</status>
                            <value_type>3</value_type>
                            <allowed_hosts/>
                            <units/>
                            <delta>0</delta>
                            <snmpv3_contextname/>
                            <snmpv3_securityname/>
                            <snmpv3_securitylevel>0</snmpv3_securitylevel>
                            <snmpv3_authprotocol>0</snmpv3_authprotocol>
                            <snmpv3_authpassphrase/>
                            <snmpv3_privprotocol>0</snmpv3_privprotocol>
                            <snmpv3_privpassphrase/>
                            <formula>1</formula>
                            <delay_flex/>
                            <params/>
                            <ipmi_sensor/>
                            <data_type>0</data_type>
                            <authtype>0</authtype>
                            <username/>
                            <password/>
                            <publickey/>
                            <privatekey/>
                            <port/>
                            <description/>
                            <inventory_link>0</inventory_link>
                            <applications>
                                <application>
                                    <name>App supervisord</name>
                                </application>
                            </applications>
                            <valuemap/>
                            <logtimefmt/>
                        </item_prototype>
                        <item_prototype>
                            <name>supervisord STARTING State of worker $1</name>
                            <type>2</type>
                            <snmp_community/>
                            <multiplier>0</multiplier>
                            <snmp_oid/>
                            <key>supervisord.workerState[{#PROGRAMM},STARTING]</key>
                            <delay>0</delay>
                            <history>7</history>
                            <trends>365</trends>
                            <status>0</status>
                            <value_type>3</value_type>
                            <allowed_hosts/>
                            <units/>
                            <delta>0</delta>
                            <snmpv3_contextname/>
                            <snmpv3_securityname/>
                            <snmpv3_securitylevel>0</snmpv3_securitylevel>
                            <snmpv3_authprotocol>0</snmpv3_authprotocol>
                            <snmpv3_authpassphrase/>
                            <snmpv3_privprotocol>0</snmpv3_privprotocol>
                            <snmpv3_privpassphrase/>
                            <formula>1</formula>
                            <delay_flex/>
                            <params/>
                            <ipmi_sensor/>
                            <data_type>0</data_type>
                            <authtype>0</authtype>
                            <username/>
                            <password/>
                            <publickey/>
                            <privatekey/>
                            <port/>
                            <description/>
                            <inventory_link>0</inventory_link>
                            <applications>
                                <application>
                                    <name>App supervisord</name>
                                </application>
                            </applications>
                            <valuemap/>
                            <logtimefmt/>
                        </item_prototype>
                        <item_prototype>
                            <name>supervisord STOPPED State of worker $1</name>
                            <type>2</type>
                            <snmp_community/>
                            <multiplier>0</multiplier>
                            <snmp_oid/>
                            <key>supervisord.workerState[{#PROGRAMM},STOPPED]</key>
                            <delay>0</delay>
                            <history>7</history>
                            <trends>365</trends>
                            <status>0</status>
                            <value_type>3</value_type>
                            <allowed_hosts/>
                            <units/>
                            <delta>0</delta>
                            <snmpv3_contextname/>
                            <snmpv3_securityname/>
                            <snmpv3_securitylevel>0</snmpv3_securitylevel>
                            <snmpv3_authprotocol>0</snmpv3_authprotocol>
                            <snmpv3_authpassphrase/>
                            <snmpv3_privprotocol>0</snmpv3_privprotocol>
                            <snmpv3_privpassphrase/>
                            <formula>1</formula>
                            <delay_flex/>
                            <params/>
                            <ipmi_sensor/>
                            <data_type>0</data_type>
                            <authtype>0</authtype>
                            <username/>
                            <password/>
                            <publickey/>
                            <privatekey/>
                            <port/>
                            <description/>
                            <inventory_link>0</inventory_link>
                            <applications>
                                <application>
                                    <name>App supervisord</name>
                                </application>
                            </applications>
                            <valuemap/>
                            <logtimefmt/>
                        </item_prototype>
                        <item_prototype>
                            <name>supervisord STOPPING State of worker $1</name>
                            <type>2</type>
                            <snmp_community/>
                            <multiplier>0</multiplier>
                            <snmp_oid/>
                            <key>supervisord.workerState[{#PROGRAMM},STOPPING]</key>
                            <delay>0</delay>
                            <history>7</history>
                            <trends>365</trends>
                            <status>0</status>
                            <value_type>3</value_type>
                            <allowed_hosts/>
                            <units/>
                            <delta>0</delta>
                            <snmpv3_contextname/>
                            <snmpv3_securityname/>
                            <snmpv3_securitylevel>0</snmpv3_securitylevel>
                            <snmpv3_authprotocol>0</snmpv3_authprotocol>
                            <snmpv3_authpassphrase/>
                            <snmpv3_privprotocol>0</snmpv3_privprotocol>
                            <snmpv3_privpassphrase/>
                            <formula>1</formula>
                            <delay_flex/>
                            <params/>
                            <ipmi_sensor/>
                            <data_type>0</data_type>
                            <authtype>0</authtype>
                            <username/>
                            <password/>
                            <publickey/>
                            <privatekey/>
                            <port/>
                            <description/>
                            <inventory_link>0</inventory_link>
                            <applications>
                                <application>
                                    <name>App supervisord</name>
                                </application>
                            </applications>
                            <valuemap/>
                            <logtimefmt/>
                        </item_prototype>
                        <item_prototype>
                            <name>supervisord UNKNOWN State of worker $1</name>
                            <type>2</type>
                            <snmp_community/>
                            <multiplier>0</multiplier>
                            <snmp_oid/>
                            <key>supervisord.workerState[{#PROGRAMM},UNKNOWN]</key>
                            <delay>0</delay>
                            <history>7</history>
                            <trends>365</trends>
                            <status>0</status>
                            <value_type>3</value_type>
                            <allowed_hosts/>
                            <units/>
                            <delta>0</delta>
                            <snmpv3_contextname/>
                            <snmpv3_securityname/>
                            <snmpv3_securitylevel>0</snmpv3_securitylevel>
                            <snmpv3_authprotocol>0</snmpv3_authprotocol>
                            <snmpv3_authpassphrase/>
                            <snmpv3_privprotocol>0</snmpv3_privprotocol>
                            <snmpv3_privpassphrase/>
                            <formula>1</formula>
                            <delay_flex/>
                            <params/>
                            <ipmi_sensor/>
                            <data_type>0</data_type>
                            <authtype>0</authtype>
                            <username/>
                            <password/>
                            <publickey/>
                            <privatekey/>
                            <port/>
                            <description/>
                            <inventory_link>0</inventory_link>
                            <applications>
                                <application>
                                    <name>App supervisord</name>
                                </application>
                            </applications>
                            <valuemap/>
                            <logtimefmt/>
                        </item_prototype>
                    </item_prototypes>
                    <trigger_prototypes>
                        <trigger_prototype>
                            <expression>{Template_APP supervisor:supervisord.workerState[{#PROGRAMM},BACKOFF].last(0)}&gt;0</expression>
                            <name>Supervisord BACKOFF State of worker {#PROGRAMM} on host {HOST.NAME}</name>
                            <url/>
                            <status>0</status>
                            <priority>4</priority>
                            <description/>
                            <type>0</type>
                        </trigger_prototype>
                        <trigger_prototype>
                            <expression>{Template_APP supervisor:supervisord.workerState[{#PROGRAMM},EXITED].last(0)}&gt;0</expression>
                            <name>Supervisord EXITED State of worker {#PROGRAMM} on host {HOST.NAME}</name>
                            <url/>
                            <status>0</status>
                            <priority>4</priority>
                            <description/>
                            <type>0</type>
                        </trigger_prototype>
                        <trigger_prototype>
                            <expression>{Template_APP supervisor:supervisord.workerState[{#PROGRAMM},FATAL].last(0)}&gt;0</expression>
                            <name>Supervisord FATAL State of worker {#PROGRAMM} on host {HOST.NAME}</name>
                            <url/>
                            <status>0</status>
                            <priority>4</priority>
                            <description/>
                            <type>0</type>
                        </trigger_prototype>
                        <trigger_prototype>
                            <expression>{Template_APP supervisor:supervisord.workerState[{#PROGRAMM},RUNNING].last(0)}=0</expression>
                            <name>Supervisord RUNNING State of worker {#PROGRAMM} on host {HOST.NAME}</name>
                            <url/>
                            <status>0</status>
                            <priority>4</priority>
                            <description/>
                            <type>0</type>
                        </trigger_prototype>
                        <trigger_prototype>
                            <expression>{Template_APP supervisor:supervisord.workerState[{#PROGRAMM},STOPPED].last(0)}&gt;0</expression>
                            <name>Supervisord STOPPED State of worker {#PROGRAMM} on host {HOST.NAME}</name>
                            <url/>
                            <status>0</status>
                            <priority>4</priority>
                            <description/>
                            <type>0</type>
                        </trigger_prototype>
                        <trigger_prototype>
                            <expression>{Template_APP supervisor:supervisord.workerState[{#PROGRAMM},UNKNOWN].last(0)}&gt;0</expression>
                            <name>Supervisord UNKNOWN State of worker {#PROGRAMM} on host {HOST.NAME}</name>
                            <url/>
                            <status>0</status>
                            <priority>4</priority>
                            <description/>
                            <type>0</type>
                        </trigger_prototype>
                    </trigger_prototypes>
                    <graph_prototypes/>
                    <host_prototypes/>
                </discovery_rule>
            </discovery_rules>
            <macros/>
            <templates/>
            <screens/>
        </template>
    </templates>
    <triggers>
        <trigger>
            <expression>{Template_APP supervisor:proc.num[supervisord].last(0)}=0</expression>
            <name>Supervisord is down on {HOST.NAME}</name>
            <url/>
            <status>0</status>
            <priority>4</priority>
            <description/>
            <type>0</type>
            <dependencies/>
        </trigger>
    </triggers>
</zabbix_export>
Не забываем перезапустить агент, чтобы агент прочитал новый конфигурационный файл:
service zabbix-agentd restart
Проверка:
zabbix_get -s HOST -k "supervisord.discovery"