Витончений спосіб вбити процес


12

Після того, як мій баш-скрипт виконаний із сервером селену, сценарій вбиває його так:

kill `ps -ef | grep selenium | awk '{ print $2 }'`

Хоча це працює, і він вбиває скрипт селену, він також намагається вбити процес для grep seleniumТак, до того моменту, коли номер процесу повернеться до команди kill, процес пропав, тому він закінчується генеруванням повідомлення про помилку. (Іншими словами: це закінчується вбивством двох процесів, один з них - справжній сервер селену, інший - швидкоплинний процес, який є побічним ефектом того, як я виконую цю команду.)

Чи є більш витончений спосіб вбити процес, який не має цієї ненавмисної побічної дії?

(FWIW одна ідея, яку я мав: цей самий скрипт запускає селен раніше в сценарії, тому, можливо, якби був спосіб, як я міг би захопити PID при запуску селену, я міг би просто зберегти це і вбити його безпосередньо, замість того, щоб хапати за ідентифікатор процесу. Проблема в тому, що я не знаю, як отримати цей PID, як використовувати змінну, щоб зберегти її, і як посилатися на неї пізніше в сценарії. Але це кращий спосіб зробити це?)

Відповіді:


12

Спробуйте використовувати, pkill seleniumякщо ні це, ні хтось з інших не працює, ви можете продовжувати використовувати свій метод з іншою послідовністю труби, наприклад

kill `ps -ef|grep -i selenium| grep -v grep| awk '{print $2}'`

pkill для цього не працює на моєму сервері, але вдосконалена греп-смужка дуже допомагає.
Ерік

20

Спробуйте pgrepкоманду, яка виведе PID команди, яка вас цікавить.

pgrep selenium

Щоб фактично вбити процес, використовуйте команду-супутник pkill.

pkill selenium

Мені подобається елегантність цього, але процес виглядає так: "root 26401 11997 2 23:20 pts / 1 00:00:00 java -jar /home/lm/cron/selenium-server-standalone-2.19.0. баночка ", тому я просто змінив його pgrep javaі працює :-) спасибі!
Ерік

2
Якщо ви дасте прапору pgrep '-f', він відповідатиме шаблону проти всього командного рядка. Отже, у цьому випадку убивати pgrep -f seleniumмає спрацювати
mills013

7
використання pkillнабагато простіше. pkillвикористовує точно такі ж критерії відповідності pgrep, що і тому ви можете зробити це в 1 команді замість 2 (і розраховувати на вихід одного).
Патрік

7

Спробуйте використовувати grep [s]elenium. Це не знайде процес grep.


Це справді корисна хитрість. Чому це працює?

2
@hesse - grepвикористовує BRE за замовчуванням. Тобто, [і ]показати в argvпротягом grep, але це не відповідає , тому що [і ]не використовуються буквально grep.
Кріс Даун

Я часто використовував | grep -v grepкомпонент у трубі. Але це досить елегантно і мені це подобається!
Олексій

Цього часто (недостатньо) недостатньо, якщо у поточному робочому каталозі є файл з тим самим іменем, що і процес, для якого ви шукаєте. Таким чином, рішення , яке я зазвичай використовую: ps -ef | grep \[s]elenium. Хоча я знайшов lsofнабагато кращу альтернативу використанню psта grep.
Мореакі

2

killallКоманда не згадувалася, і я відчуваю , що це є корисним доповненням до репертуару.

$ killall selenium

Ви також можете скористатися -r regexпараметром, щоб вказати регулярний вираз відповідно до назви процесу та навіть значення часу:

$ killall -o 5m selenium 

Вбиває всі процеси селену старші 5 хвилин.


Це здається унікальним для версій, які не є RHEL / CentOS,killall
ewwhite

0

Використовуйте -m 1перемикач із командою grep, щоб отримати лише перший знайдений процес. Поки ви сортуєте свої процеси за PID, зростаючи, він буде працювати.


1
Ви не можете бути впевнені, що селеновий процес використовує нижчий PID.
FJRA

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