Як вбити, лише якщо процес запущений?


14

В даний час я використовую такий рядок у своєму скриптовому файлі sh:

kill `ps aux | grep -F 'myServer' | grep -v -F 'grep' | awk '{ print $2 }'` 

Але мені цікаво, як це викликати, лише якщо процес ( myServerтут) працює?


неможливо зателефонувати killлише тоді, коли процес запущений, оскільки між тестом та викликом перегонів є умова перегону kill(можливо, за короткий час процес зупинився з іншої причини). Ви повинні використовувати pkillабо killallякі робити точно так само, як ви намагаєтесь зробити, але з меншим типом (і, мабуть, і іншими іншими перевагами).
JanC

Відповіді:


20

Зазвичай я просто використовую pgrep і pkill

if pgrep myServer; then pkill myServer; fi

7
Чому ні pkill myServerчи killall -q myServer? Немає недоліків у спробі вбити неіснуючі процеси.
Девід Фоерстер

12
Він не вийде з 0, якщо немає процесу вбивства, тому він може порушити сценарії.
boutch55555

6
Додайте || trueпотім.
Девід Фоерстер

Щоправда, але ви не матимете гнучкості додати ще одне, щоб повідомити, що процес уже мертвий.
boutch55555

Про що if ! killall -q myServer; then echo ERROR; fi?
Девід Фоерстер

9

Ви можете вбивати процеси за іменем, використовуючи pkillабо killallперевіряючи їх довідкові сторінки.


так, на відміну від killцього, це вбиває лише в тому випадку, якщо процес запущений. Наприкладpkill -u myuser -f myprocess\.[0-9]+
Чейз Т.

6

Трохи інший підхід був би приблизно таким:

killall PROCESS || echo "Process was not running."

Це дозволить уникнути 1повернення Команди помилок з killallкоманди, якщо процес не існував. echoЧастина буде тільки в дію, якщо killallповертається 1, в той час як сам повернеться 0(успіх).


5
Використовувати killall -qкраще
Анвар

1
Попередження, killall -qне підтримується у всіх ароматах unix, у macOS Catalina все ще немає.
tresf

0

спробуйте використовувати:

sudo kill `pidof process_name`

де ім'я_файлу - це ім'я процесу, який потрібно вбити. Що в цьому важливо, це те, що pidof відобразить список усіх процесів, що відповідають заданому імені. Оскільки kill приймає декілька Pid-кодів, вони вбиватимуть усіх за один примху.

Повідомте мене, якщо це допомагає.


Що робити, якщо список порожній? (моя головна думка полягала в тому, щоб взагалі не закликати вбивати)
myWallJSON

1
Якщо список порожній, kill поверне код помилки 1 і нічого не вб'є. Це було б рівнозначно спробі викликати убийство без аргументів. Ви можете додати оператор if, який спочатку перевіряє, чи pidof повертає порожній список. Якщо він не повертає порожній список, дзвоніть kill `pidof process_name. Якщо він поверне порожній список, пропустіть виклик вбивства.
amandion

0

Маленький сценарій, який я створив з дослідженнями та розробками. Сподіваюся, вам сподобається

#!/bin/bash

echo " Enter the process name:"
read $proc_name
if pgrep $proc_name
then
echo " $proc_name running "
pkill $proc_name
echo "$proc_name  got killed"
else
echo " $proc_name is not running/stopped "
fi

збережіть його з таким ім'ям, як script.sh тоді

chmod +x script.sh
./script.sh

Потім вкажіть назву процесу.

Примітка: Я багато разів намагався з цим і його штрафом.


Чи можу я знати, що з цим сценарієм не так, і для голосування потрібне пояснення, будь ласка.
rɑːdʒɑ

Нічого поганого в цьому сценарії ... +1
WinEunuuchs2Unix

0

Перевірте, чи існує процес pidof. Якщо так, вбийте:

(! pidof process_name) || sudo kill -9 $(pidof process_name)

Код виходу завжди 0, після виконання вищевказаної команди.


0

Використовувати pkillз опцією-f

pkill -f myServer

Опція -f- це шаблон, який зазвичай співпадає з назвою процесу.


-1

Я б використав:

ps x --no-header -o pid,cmd | awk '!/awk/&&/myServer/{print $1}' | xargs -r kill

xargs -rКаже бігти вбивати тільки при наявності вхідного сигналу. ps --no-header -eo pid,cmdОтримує вихід в кращий формат для аналізу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.