views:

246

answers:

6

Hello

I want to attach to a running process using 'ddd', what I manually do is:

# ps -ax | grep PROCESS_NAME

Then I get a list and the pid, then I type:

# ddd PROCESS_NAME THE_PID

Is there is a way to type just one command directly?

Remark: When I type ps -ax | grep PROCESS_NAME, grep will match both the process and grep command line itself.

+1  A: 

There is an easy way to get rid of the grep process:

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

(as long as the process you're trying to find doesn't include the string " grep ").

So something like this should work in a script (again, assuming there's only one copy running):

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

If you call your script dddproc, you can call it with:

dddproc myprogramname

Although I'd add some sanity checks such as detecting if there's zero or more than one process returned from ps and ensuring the user supplies an argument.

paxdiablo
Your answer is half the solution. I was expecting some grep command that would yield only the PID, so then I can do something like:ddd PROCESS_NAME $(THE_MAGIC_GREP_COMMAND)
lallous
@lallous, the `grep | grep -v | awk` will give you the PID of the processs. `grep -v grep` strips out the (grep process) line you're complaining about and `awk '{print $1}' gives you just the PID.
paxdiablo
Excellent, thank you for the script!
lallous
+1  A: 

As separate commands:

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

In one line:

% PID=`ps -ax | grep ${PROCESS_NAME} | grep -v grep | cut -d ' ' -f 1-2` && ddd ${PROCESS_NAME} ${PID}
Paul R
I am using Ubuntu 10's bash, and this worked:$ ddd ${PROCESS_NAME} $(ps -ax | grep ${PROCESS_NAME} | grep -v grep | cut -d ' ' -f 1)Thanks!
lallous
@lallous: yes, that looks to be equivalent - TMTOWTDI, as they say... ;-)
Paul R
A: 

Do this way -

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

Kiran
A: 
ddd <process_name> `pgrep <process_name>`
Casual Coder
A: 

you can use pggrep to find the process

anish
A: 

You can use awk to both filter and get the column you want. The "exit" limits the ps results to the first hit.

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

ddd_grep PROCESS_NAME

You may have to adjust the columns for your ps output. Also you can change the == to ~ for regex matching.

Randy Proctor