Команда оболочки, чтобы найти идентификатор процесса и присоединиться к нему? - PullRequest
3 голосов
/ 14 мая 2010

Я хочу присоединиться к работающему процессу, используя 'ddd', что я делаю вручную:

# ps -ax | grep PROCESS_NAME

Затем я получаю список и pid, затем я набираю:

# ddd PROCESS_NAME THE_PID

Есть ли способ набрать только одну команду напрямую?

Примечание: Когда я набираю ps -ax | grep PROCESS_NAME, grep будет соответствовать как процессу, так и самой командной строке grep.

Ответы [ 6 ]

3 голосов
/ 14 мая 2010

Существует простой способ избавиться от процесса grep:

ps -ax | grep PROCESS_NAME | grep -v ' grep '

(пока процесс, который вы пытаетесь найти, не включает строку " grep ").

Так что-то вроде этого должно работать в скрипте (опять же, при условии, что работает только одна копия):

pid=$(ps -ax | grep $1 | grep -v ' grep ' | awk '{print $1}')
ddd $1 ${pid}

Если вы называете свой скрипт dddproc, вы можете вызвать его с помощью:

dddproc myprogramname

Хотя я бы добавил некоторые проверки работоспособности, такие как обнаружение нуля или более одного процесса, возвращенного из ps, и обеспечение предоставления пользователем аргумента.

1 голос
/ 14 мая 2010

Как отдельные команды:

% PID=`ps -ax | grep ${PROCESS_NAME} | grep -v grep | cut -d ' ' -f 1-2`
% ddd ${PROCESS_NAME} ${PID}

В одну строку:

% PID=`ps -ax | grep ${PROCESS_NAME} | grep -v grep | cut -d ' ' -f 1-2` && ddd ${PROCESS_NAME} ${PID}
0 голосов
/ 14 мая 2010

Вы можете использовать awk для фильтрации и получения нужного столбца. «Выход» ограничивает результаты ps первым попаданием.

function ddd_grep() {
  ddd $(ps -ax | awk -v p="$1" '$4 == p { print $1; exit 0; }');
}

ddd_grep PROCESS_NAME

Возможно, вам придется настроить столбцы для вывода ps. Также вы можете изменить == на ~ для соответствия регулярному выражению.

0 голосов
/ 14 мая 2010

вы можете использовать pggrep, чтобы найти процесс

0 голосов
/ 14 мая 2010
ddd <process_name> `pgrep <process_name>`
0 голосов
/ 14 мая 2010

Делай так -

ddd PROCESS_NAME \`ps -ax | grep PROCESS_NAME | grep -v grep | awk '{print $1}'\`
...