Я не уверен, что вы ищете, но вы можете создавать простые службы, используя socat
, чтобы прослушивать порт и получать он запускает сценарий оболочки, например, для каждого соединения. Вы можете ограничить максимальное количество одновременных подключений. Например, создайте сценарий bash ./ myscript
с удержанием:
#!/bin/bash
read message
echo "hello. got $message"
sleep 10
echo "bye"
Затем запустите socat
на порту 10005 с макс 2 дочерними элементами, чтобы запустить сценарий:
socat TCP4-LISTEN:10005,reuseaddr,fork,max-children=2 SYSTEM:./myscript
Теперь вы можете подключиться к этому порту используя любой сетевой инструмент, который вам нравится, и взаимодействуйте со скриптом.Используя встроенную функцию bash / dev / tcp /
для подключения к порту, будет достаточно следующего:
(echo "$(date) my message"; cat -n >&2) <>/dev/tcp/localhost/10005 >&0 &
Если вы введете эту команду несколько раз, только 2 будут выполнены, а остальные будут поставлены в очередь. Типичный вывод будет
1 hello. got Wed May 11 17:33:19 CEST 2016 my message
2 bye
Я вижу, вы используете NRPE, удаленный исполняющий модуль Nagios. Правильный способ сделать это — вызвать NRPE через sudo и сообщить SELinux, что NRPE разрешено вызывать sudo.
Убедитесь, что вы разрешили пользователю nrpe
в sudo config, например. делая:
» cat /etc/sudoers.d/nrpe
Defaults:nrpe !requiretty
nrpe ALL = (root) NOPASSWD: /sbin/service <whatever> status
Определите проверку, замените my_service
фактическим именем службы:
» cat /etc/nrpe.d/nrpe_custom_checks.cfg
command[check_my_service]=/usr/lib64/nagios/plugins/check_service_status_sudo my_service
Это будет ваш сценарий проверки:
0» cat /usr/lib64/nagios/plugins/check_service_status_sudo
#!/usr/bin/env bash
# Don't use -e, since we expect commands to fail
set -uo pipefail
OK=0
WARN=1
CRIT=2
UNKNOWN=3
STATE=${UNKNOWN}
MSG=""
if [[ $# -ne 1 ]]; then
echo "UNKNOWN - $0 needs one argument. Aborting."
exit ${UNKNOWN}
fi
SERVICENAME="$1"
OUTPUT=$(/usr/bin/sudo /sbin/service ${SERVICENAME} status 2>&1)
ES=$?
if [[ $ES -eq 0 ]]; then
STATE=${OK}
MSG="OK"
elif [[ $ES -eq 1 ]]; then
# either not running or unrecognized service
if echo "${OUTPUT}" | grep -q "unrecognized service"; then
STATE=${WARN}
MSG="WARNING"
else
STATE=${CRIT}
MSG="CRITICAL"
fi
fi
echo "${MSG} - ${OUTPUT}";
exit ${STATE}
Вам может потребоваться установить это логическое значение SELinux для вашего случая использования -:
» setsebool -P nagios_run_sudo on