Як отримати pid запущеного процесу за допомогою однієї команди, що аналізує вихід PS?


22

Я шукаю єдиний рядок, який би повертав пид запущеного процесу.

На даний момент у мене:

ps -A -o pid,cmd|grep xxx|head -n 1

І це повертає кулак pid, command. Мені потрібно лише перше число з виходу, а решта проігнорувати. Я гадаю, sedчи awkдопоміг би тут, але мій досвід з ними обмежений.

Також у цього є ще одна проблема, вона поверне pid grep, якщо ххх не працює.

Дійсно важливо мати єдиний рядок, тому що я хочу повторно використовувати висновок, щоб зробити щось інше, як-от убивство цього процесу.


1
пропустити його через голову і вказати лінію для повернення з -n 1?
Майк Макмахон

Відповіді:


28

Якщо ви просто хочете розгорнути процес, ви можете скористатися, pgrepякщо є. pgrep <command>поверне pid команди (або список pids у випадку, якщо є кілька екземплярів запущеної команди; у цьому випадку ви можете скористатися headіншими або відповідними командами)
Сподіваюся, це допоможе!


+1 Моє звичайне використання pgrep:kill `pgrep xxx`
Стів

20
@steve: Можливо, варто поглянути pkill.
Призупинено до подальшого повідомлення.

7

Потрібна ще одна команда; вам потрібно лише перше поле з рядка розділених пробілом значень:

ps -A -o pid,cmd|grep xxx | grep -v grep |head -n 1 | awk '{print $1}'

Ну, два. Я додав ще одну grep для видалення grep з виводу.


6

Просто використовуйте pgrep, це набагато прямо вперед

pgrep -o -x xxxx

Сказане вибирає найдавніший процес з точною назвою


А оскільки ОП хоче використовувати команду для вбивства процесу, pkill(з тими ж аргументами) був би найбільш прямим вибором.
bstpierre


0

Працює на Cygwin, тому я не можу використовувати -A і -o, але щось подібне:

$ ps
      PID    PPID    PGID     WINPID   TTY     UID    STIME COMMAND
     4580       1    4580       4580  ?       55573   May 21 /usr/bin/mintty
     5808    7072    5808       7644  pty3    55573 13:35:31 /usr/bin/ps
     7072    5832    7072       6424  pty3    55573   May 21 /usr/bin/bash


$ ps | grep '/usr/bin/mintty' | head -n 1 | awk '{print $1}'
4580

0

ви можете зробити щось подібне

ps -A -o cmd,pid | egrep "^xxx " | head -n 1 | sed -r -e 's/.* ([0-9]+)$/\1/'

тоді xxx має бути ім'ям процесу, і він не збиратиметься grep через якір ^

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