Как написать сценарий оболочки, чтобы найти PID и убить

Как написать сценарий оболочки, чтобы найти PID и убить

28.05.2015 09:55:28 Просмотров 21 Источник

Я пытаюсь написать сценарий, который ищет PID другого сценария, который выполнялся ранее. Как только он находит этот PID, он посылает сигнал к убийству.

Я могу найти PID, но сигнал убийства не обрабатывается, я получаю ответное сообщение, что это не PID.

Вот что я делаю.:

#!/bin/bash   
 PID=`ps -eaf | grep "start.sh" | awk '{print $2}'`
    echo "$PID"    
    if [[ -z "$PID" ]];
     then(
            echo "Start script is not running!"
    )else(
            kill -9 $PID
    )fi

Сценарий, который он пытается убить, запускает множество других сценариев, поэтому я надеюсь, что убийство start.shубьет все дочерние процессы.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill#comment49105021_30514923
Я пробовал "киллалл start.sh" который возвращает "процесс не найден". Вот почему я пытаюсь убить ПИД.
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill#comment49105113_30514923
Я пробовал pkill, но это не процесс его. Когда я бегу сверху, это все еще видно как бег.

Ответы - Как написать сценарий оболочки, чтобы найти PID и убить / How to write a shell script to find PID and Kill

Является ответом!
Songy

28.05.2015 10:13:50

Когда ты бежишь

ps -eaf | grep "start.sh" | awk '{print $2}'

вы создаете подпочву со словом start.shв нем. grepзатем возьмет на себя свой собственный процесс и start.shодин, так что вы получите два PIDs обратно.

Это означает, когда вы пытаетесь убить обоих start.shи еще ...

ps -eaf | grep "start.sh" | awk '{print $2}'

процессы. Тот самый start.shумрет, но другой больше не будет существовать, поэтому его нельзя убить, поэтому он дает вам ошибку.

Если бы вы разделили команды, вам могло бы повезти больше.:

PIDS=$(ps -eaf)
PID=$(echo "$PIDS" | grep "start.sh" | awk '{print $2}')
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30515239#comment49107813_30515239
Более распространенный способ сделать это-с паттерном grep, который не соответствует самому себе; например, [s]tart[.]shспички start.shstart.sh но не сам по себе; таким образом, вам не нужно беспокоиться о буферизации выходных данных в переменной оболочки.
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30515239#comment49107819_30515239
...тем не менее, гораздо лучшей практикой было бы выяснить, почему pkill не работает на ОП и исправить это. :)
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30515239#comment49108085_30515239
Я все еще думаю, что [s]tart[.]shбудет соответствовать обоим процессам, но pkill не работает/не работает, потому что один из процессов, который он захватил PID to kill, закончился, поэтому, когда он попытался убить его, его там не было, поэтому он ошибся.
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30515239#comment49108206_30515239
ААА. Вы всегда можете использовать pgrepи убить себя, если захотите. И нет, [s]tart[.]shне будет соответствовать обоим, потому [s]соответствует только s; он не соответствует литеральной строке [s].
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30515239#comment49108282_30515239
Ах да, просто пронесло насквозь. Это умно :P и да pgrep-это вариант, я сделал это по-своему, потому что это было ближе всего к исходному вопросу ОП, и это помогает им понять, почему это произошло больше...Я надеюсь: D
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30515239#comment49115767_30515239
Это довольно запутанный способ сделать это. grep start.sh < <(ps -eaf) | grep -v grepсохраняет нерест дополнительной подрешетки и использует перенаправление вместо конвейерного вывода echo
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30515239#comment49122268_30515239
Когда ваш сценарий будет поддерживаться другими, также добавьте комментарий. Я боюсь нуба, который думает, что может улучшить код, объединив две строки.
Alex

28.05.2015 10:22:58

Попробуйте использовать pgrep:

PID=$(pgrep yourprocesname)
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30515410#comment49107938_30515410
pgrep <yourprocessname> | xargs -i{} kill -9 {}
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30515410#comment94323406_30515410
Если у вас есть pgrep, вы также должны иметь pkillи должны использовать его напрямую. linux.die.net/man/1/pkill
Trevor Hickey

28.05.2015 11:14:54

Вот еще одно решение, которое может быть полезно для кого-то:

#!/bin/bash  
kill-process-by-name(){  
   processes=$(ps -A)
   kill -9 `echo "$processes" | grep "$1" | cut -f2 -d" "`
}

kill-process-by-name "start.sh"
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30516272#comment49107860_30516272
Что хорошего в скрипте, который определяет функцию, но никогда не вызывает ее?
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30516272#comment49107997_30516272
@CharlesDuffy добавил вызов функции. Идея заключалась в том, что вы должны были поместить это в начало вашего сценария и вызвать его по мере необходимости. Таким образом, у вас не будет дублированного кода, если ваш скрипт решит убить более одного процесса.
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30516272#comment49108227_30516272
Здесь также нет защиты от обнаружения и убийства grep start.shпроцесс, в отличие от start.shпроцесс.
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30516272#comment49111995_30516272
@CharlesDuffy это действительно хороший момент. Я убедился, что команда ps оценивается до выполнения команды grep.
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30516272#comment49116741_30516272
Нужно больше цитировать; прямо сейчас echo $processesсворачивает все в одну строку.
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30516272#comment49116951_30516272
@CharlesDuffy я первоначально протестировал его в zsh, где он работал без кавычек. Кавычки были добавлены, так что он функционирует должным образом под Баш.
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30516272#comment49133406_30516272
Не просто Баш вещь, в POSIX Ш. штука; ЗШ нарушает стандарт не выполнив разделение строки на расширение некотируемых.
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30516272#comment49140165_30516272
(Чтобы процитировать Мои источники на этот счет ... pubs.opengroup.org/onlinepubs/009695399/utilities/... ; " после расширения параметра [...] оболочка должна сканировать результаты разложений и замен, которые не произошли в двойных кавычках для расщепления поля . ")
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/30516272#comment105798815_30516272
При ответе важно объяснить, как это работает и почему это должно быть выбранным ответом. Мы хотим обучать, а не просто выбрасывать код, чтобы человек знал, как исправить проблему, если она возникнет снова.
jag

23.03.2018 09:36:13

Вы можете использовать pidof, а ps -ef

PID=`pidof start.sh | awk '{print $1}'`
echo "$PID csshst will be stopped"
if [[ -z "$PID" ]]; then
(
        kill -9 $PID
)
fi
https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/49456348#comment105798811_49456348
При ответе важно объяснить, как это работает и почему это должно быть выбранным ответом. Мы хотим обучать, а не просто выбрасывать код, чтобы человек знал, как исправить проблему, если она возникнет снова.
user12748121

20.01.2020 04:02:13

trashPID=`pidof start.sh | awk '{print $1}'`
echo "$PID csshst will be stopped"
if [[ -z "$PID" ]]; then
(
        kill -9 $PID
)
fi

чисто

https://stackoverflow.com/questions/30514923/how-to-write-a-shell-script-to-find-pid-and-kill/59823882#comment105798742_59823882
При ответе важно объяснить, как это работает и почему это должно быть выбранным ответом. Мы хотим обучать, а не просто выбрасывать код, чтобы человек знал, как исправить проблему, если она возникнет снова.
Закрыть X