Solved

Full path name of process command

Posted on 2004-09-01
8
13,328 Views
Last Modified: 2013-12-27

How do I get the full path name of the command used to start a process ?
(in a shell script)

Specifically a process might be started as "./xxx" where xxx is the binary.
No matter what version of ps I try it will not reveal to me where the binary
resides.

I've tried for example:  

    /usr/ucb/ps -auxwwwl
    ps -efd

I also tried using /usr/proc/pmap <pid> but this command will only tell me the
full path of library files used by the process, not the binary itself.

Any ideas ?

Thanks
0
Comment
Question by:kxix
8 Comments
 

Author Comment

by:kxix
ID: 11950286
I'm on Solaris 2.6.
0
 
LVL 45

Accepted Solution

by:
sunnycoder earned 500 total points
ID: 11950370
Hi kxix,

http://forum.sun.com/thread.jsp?forum=4&thread=20328&tstart=0&trange=15
http://forum.sun.com/thread.jsp?forum=10&thread=9437

The ps(1) command and others report the result from the proc(4) filesystem, which
caches the first 16 characters of the filename used to exec() the process, as well as
the first 80 characters of the argv[]. This is what ps -o comm and ps -o args report.
If you want the full path, you can take advantage of the new Solaris 10 feature
that permits filenames to be cached and reported in the kernel -- the new pfiles(1)
takes advantage of this, and you can use it to answer this question as well by
simply looking at the /proc/<pid>/path/a.out symlink. For example, to find the path
of the "ls" command I run I can do this on a Solaris 10 system:

$ ls -l /proc/self/path/a.out
lrwxrwxrwx 1 mws staff 0 Jun 19 18:57 /proc/self/path/a.out -> /usr/bin/ls*

or here is the path of my shell

$ ls -l /proc/$$/path/a.out
lrwxrwxrwx 1 mws staff 0 Jun 19 16:14 /proc/200300/path/a.out -> /usr/bin/ksh*

Sunnycoder
0
 
LVL 38

Expert Comment

by:yuzh
ID: 11959331
To find out the FULL path of the command, you need to use: /usr/bin/ps with -o args,
eg:

/usr/bin/ps -e -o pid,args | grep mycommand

man ps
to learn more details.

0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:kxix
ID: 11961509
Reply to yuzh:  Nope, does not return the full path name of the binary if the
process was started from the directory where the binary resides.
0
 
LVL 38

Expert Comment

by:yuzh
ID: 11969835
That's the limit of ps, but it does tell the story about how the process was start!

When you run something like:

./ls

it show you ./ls

/bin/ls

it give you

/bin/ls
0
 

Expert Comment

by:matjc
ID: 12388409
You can't expect the world. If you run a process such as ./ls then how is the kernel supposed to remember where you started it from in the future?

Either get into the habit of running all your processes with their full path eg /usr/bin/ls or put up with it.

You can of course "find / -name "ls" -ls" and see how many binaries you have and where it is of the indentified process.

Then use your memory to remember which one you ran ;)

0
 
LVL 11

Expert Comment

by:siliconbrit
ID: 12586528
Comments from matjc are entirely correct, the newer implementation of the /proc filesystem has taken away a few things we used to take for granted, and to be fair its tough to ask the OS to store the absolute path with every process when 1000s are started/dropped in every minute.

However, dont give up - here's a couple of 'B' grade answers because I'm in a bit of a hurry:

1. Try the UCB ps command

If you have /usr/ucb/ps installed (or /ucb/ps) you could try that version of ps.  Its not truly supported for Solaris 9 and later, but a lot of corporations put a lot of heat on Sun to make sure it is still available to support older scripts.  If I'm right, you can use:

   /usr/ucb/ps -auxwww

If this doesn't work, look around for the options available to that version of the ps command.

2. Use the pfiles tools to determine the environment under which the process was run.

If you do a 'man pfiles' I believe there is one command that can show you the working environment when the process was started.  You should be able to use the pfiles tools to find

Using this tool, you should be able to work out the command line (CMD), the Current Working Directory (CWD) and PATH.  You can then write a simple script to do the following:

If $CMD matches "./binary",
   then
      the path is "$CWD/binary".
If the process was started without any '/' characters,
   then
      set path to $PATH
      which "$CMD"

Note that I just used the variable names to shorten this text, you'll have to make up your own :-)

0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This tech tip describes how to install the Solaris Operating System from a tape backup that was created using the Solaris flash archive utility. I have used this procedure on the Solaris 8 and 9 OS, and it shoudl also work well on the Solaris 10 rel…
I promised to write further about my project, and here I am.  First, I needed to setup the Primary Server.  You can read how in this article: Setup FreeBSD Server with full HDD encryption (http://www.experts-exchange.com/OS/Unix/BSD/FreeBSD/A_3660-S…
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.

685 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question