Ваш подход в корне ошибочен. Вы измельчаете мясо в гамбургер для транспортировки, а затем хотите вернуть корову в конце. Нет, это не работает.
Вместо того, чтобы вставлять строку непосредственно в команду оболочки, передайте ее в качестве аргумента. Я не знаком с Zabbix, но, глядя на документацию, похоже, что это работает (например, внешние проверки , параметры пользователя : вы указываете команду и аргументы, которые так что укажите только test.sh
в качестве команды и укажите, что параметр, который она получает, - это "{TRIGGER.VALUE}"
. m не знаком с Zabbix), это означает, что вы пишете что-то вроде
test.sh["{TRIGGER.VALUE}"]
В test.sh
, чтобы сослаться на аргумент скрипта, помните, что вам нужно написать "$ 1 "
, а не $ 1
.
Если вам нужна только поддержка Linux (, что, я думаю, так и есть, учитывая, что ваш вопрос помечен тегом linux ), вы можете использовать символические ссылки /proc/%d/exe
.
Вот пример того, как может выглядеть сценарий.
#!/bin/bash
if [ "$#" != 1 ] || [ "$1" = "" ]
then
echo "Usage: $0 <full-exe-path>" 1>&2
exit 1
fi
shopt -s extglob
cd /proc
for PID in [1-9]*([0-9])
do
if [ "$(readlink "$PID"/exe)" = "$1" ]
then
kill "$PID"
fi
done
Следует заметить, что если идентификатор процесса является потоком ядра или не принадлежит вам, readlink
произойдет сбой, и "$(readlink "$PID"/exe)"
будет оцениваться как пустая строка. Чтобы избежать попыток убить все эти процессы, сценарий откажется что-либо делать, если $1
является пустой строкой.
Также обратите внимание, что этот сценарий использует extglob
, что позволяет сопоставлять каталоги с [1-9]*([0-9])
, что означает символ в интервале 1-9
, за которым следует любое количество символов в интервале 0-9
.
Я делаю это в одном -вкладыше с трубой (нужно gawk
иxargs
):
$>ps -ax | grep "/app2/main" | grep -v "grep" | gawk '{print $1}' | xargs kill
Что здесь происходит?
ps -ax # — list all processes in extended format
grep "/app2/main" # — show only processes that contain "/app2/main"
grep -v "grep" # — sort out the previous grep process with the mentioned string
gawk '{print $1}' # — use gawk to pick only the first column (process id)
xargs kill # — use xargs to pass pid to kill as an argument
Это эффективно посылает сигнал уничтожения нужному процессу. Вы можете обернуть его в сценарий bash, если вам нужна короткая команда с аргументом.