Получить pid указанного имени процесса из pstree с помощью сценария оболочки

Я использую pstree, чтобы получить набор процессов, и результат будет

processA (123) --- processB (124) --- processC (125) --- processTarget(126) --- processD (127)

Я хотел бы использовать ключевое слово "processTarget", чтобы получить pid, то есть 126.

Причина, по которой я выбрал pstree, заключается в том, что я отправлю сигнал SIGTSTP и SIGCONT на этот набор процессов.

Как я мог это сделать? Легко ли это сделать?

Примечание: processTarget(126) не находится в фиксированном положении, поэтому я не мог использовать awk для получения PID.

3 ответа

Решение

Ты можешь использовать grep,

<pstree command> | grep -P -o 'processTarget\([0-9]+\)'

-P означает использовать Perl регулярное выражение-o значит только вернуть матч

man grep Больше подробностей

Если цель состоит в том, чтобы получить только идентификатор, вы можете продолжить этот подход, чтобы вернуть только целое число

<pstree command> | grep -P -o 'processTarget\([0-9]+\)' | grep -P -o '[0-9]+'

Это довольно легко с расширением параметра / извлечением подстроки. Пример:

#!/bin/bash

##plist=$( pstree something )  # actual command to fill plist

plist="processA(123)---processB(124)---processC(125)---processTarget(126)---processD(127)"

temp="${plist##*processTarget(}"
ptgtnum="${temp%%)--*}"

printf "\n  processTarget = %s\n\n" "$ptgtnum"

exit 0

Выход

$ bash ptgt.sh

  processTarget = 126

Вы могли бы рассмотреть sed:

echo 'processA(123)---processB(124)---processC(125)---processTarget(126)---processD(127)' \ | sed 's/.*processTarget(\([0-9]*\)).*/\1/'
126
Другие вопросы по тегам