3 разных приложения с одним и тем же именем файла в разных местах, как убить одно по его полному имени?

Ваш подход в корне ошибочен. Вы измельчаете мясо в гамбургер для транспортировки, а затем хотите вернуть корову в конце. Нет, это не работает.

Вместо того, чтобы вставлять строку непосредственно в команду оболочки, передайте ее в качестве аргумента. Я не знаком с Zabbix, но, глядя на документацию, похоже, что это работает (например, внешние проверки , параметры пользователя : вы указываете команду и аргументы, которые так что укажите только test.sh в качестве команды и укажите, что параметр, который она получает, - это "{TRIGGER.VALUE}" . m не знаком с Zabbix), это означает, что вы пишете что-то вроде

test.sh["{TRIGGER.VALUE}"]

В test.sh , чтобы сослаться на аргумент скрипта, помните, что вам нужно написать "$ 1 ", а не $ 1 .

0
04.06.2018, 09:33
2 ответа

Если вам нужна только поддержка 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.

0
28.01.2020, 04:19

Я делаю это в одном -вкладыше с трубой (нужно 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, если вам нужна короткая команда с аргументом.

0
10.11.2021, 13:53

Теги

Похожие вопросы