Solved

Full path name of process command

Posted on 2004-09-01
8
13,306 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
Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 

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: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

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

Suggested Solutions

In tuning file systems on the Solaris Operating System, changing some parameters of a file system usually destroys the data on it. For instance, changing the cache segment block size in the volume of a T3 requires that you delete the existing volu…
Introduction Regular patching is part of a system administrator's tasks. However, many patches require that the system be in single-user mode before they can be installed. A cluster patch in particular can take quite a while to apply if the machine…
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.

809 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