0

Trying to get the home directory of running process. For Linux, I learned that I could use /proc/PID/exe information, but I think there is no that information in other OS.

Assuming that there is no file information $PATH, can you let me know how I can get the home directory of the running process? I just need to assume that OS utilities usage is very limited in OS, meaning that I should use very common command.

Condition: No special utility such as lsof.

Added

The process I am referring is the process a 3rd-party application runs.

Thanks in advance.

Sigularity
  • 917
  • 2
  • 12
  • 28

1 Answers1

1

The first column for ps -ef (the most common useful-options, in POSIX) give you the process owner, usually a name (sometimes only the uid number). For example

UID         PID   PPID  C STIME TTY          TIME CMD                           
statd      1935      1  0 04:00 ?        00:00:00 /sbin/rpc.statd               
101        2329      1  0 04:00 ?        00:00:00 /usr/bin/dbus-daemon --system 
daemon     2511      1  0 04:00 ?        00:00:00 /usr/sbin/atd                 
avahi      2540      1  0 04:01 ?        00:00:00 avahi-daemon: running [vmw-de>
avahi      2541   2540  0 04:01 ?        00:00:00 avahi-daemon: chroot helper   
bind       2593      1  0 04:01 ?        00:00:00 /usr/sbin/named -u bind       
kdm        2781   2780  0 04:01 ?        00:00:01 /usr/lib/kde4/libexec/kdm_gre>
www-data   2903   2782  0 04:01 ?        00:00:00 /usr/sbin/apache2 -k start    
www-data   2904   2782  0 04:01 ?        00:00:00 /usr/sbin/apache2 -k start    
www-data   2905   2782  0 04:01 ?        00:00:00 /usr/sbin/apache2 -k start    
www-data   2906   2782  0 04:01 ?        00:00:00 /usr/sbin/apache2 -k start    
www-data   2908   2782  0 04:01 ?        00:00:00 /usr/sbin/apache2 -k start    
ntp        2989      1  0 04:01 ?        00:00:00 /usr/sbin/ntpd -p /var/run/nt>
postgres   3059      1  0 04:01 ?        00:00:00 /usr/lib/postgresql/9.1/bin/p>
postgres   3063   3059  0 04:01 ?        00:00:00 postgres: writer process     >
postgres   3064   3059  0 04:01 ?        00:00:00 postgres: wal writer process >
postgres   3065   3059  0 04:01 ?        00:00:00 postgres: autovacuum launcher>
postgres   3066   3059  0 04:01 ?        00:00:00 postgres: stats collector pro>
104        3555      1  0 04:01 ?        00:00:00 /usr/sbin/exim4 -bd -q30m     
gitlog     3677   3676  0 04:01 ?        00:00:00 svlogd -tt /var/log/git-daemon
116        3679   3676  0 04:01 ?        00:00:00 /usr/lib/git-core/git-daemon 

The process owner name (or uid number) are in /etc/passwd as the first column (for the name) or the third column (uid number). Columns in /etc/passwd are delimited by colons (:). For example:

root:x:0:0:root:/root:/bin/bash                                            
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
irc:x:39:39:ircd:/var/run/ircd:/bin/sh
gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/bin/sh
nobody:x:65534:65534:nobody:/nonexistent:/bin/sh
libuuid:x:100:101::/var/lib/libuuid:/bin/sh
messagebus:x:101:105::/var/run/dbus:/bin/false
colord:x:102:106:colord colour management daemon,,,:/var/lib/colord:/bin/false
usbmux:x:103:46:usbmux daemon,,,:/home/usbmux:/bin/false
Debian-exim:x:104:111::/var/spool/exim4:/bin/false
statd:x:105:65534::/var/lib/nfs:/bin/false
avahi:x:106:114:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false

In this example, statd is

statd:x:105:65534::/var/lib/nfs:/bin/false

The next-to-last column of /etc/passwd is the home directory of the process, e.g., /var/lib/nfs for the statd process.

Some system processes have no home directory, e.g., you may see /usr/sbin on Linux systems, or some other directory that several processes share.

Further reading:

OP amended question to indicate that the current directory (rather than home-directory) is wanted. Systems using a proc-filesystem can provide this information. Those are Solaris, AIX and Linux.

However, HPUX does not (see for example /proc on HP-UX?, which says the pstat system-call can be used). I do not see a possibility, reading its manual page, but the link below says pstat_getpathname will work.

AIX supports it, according to IBM documentation.

Look for the cwd "file" for the working directory of a given process in systems with a proc-filesystem.

Further reading:

Community
  • 1
  • 1
Thomas Dickey
  • 51,086
  • 7
  • 70
  • 105
  • Thanks for detail explanation. But, I need to find the location of process running, the process is not native OS process. For example if there is a process named run_it_first of any other 3rd party application, and it is launched from /usr/userapp/bin/run_it_first, I need to get '/usr/userapp/bin' value. Thanks. – Sigularity Feb 01 '16 at 10:14
  • That is called the "current working directory", not the "home directory". Solaris and Linux have proc-filesystems from which you could get this information (I don't recall HPUX and AIX as being possible). – Thomas Dickey Feb 01 '16 at 10:18
  • Maybe the question refers to the location of the executable file? – Zsigmond Lőrinczy Feb 01 '16 at 15:41
  • Hi, @Thomas. Thanks for your clear explanation. I am looking for pstat_getpathname further to accomplish this requirement. Once it is done, I think I can share it. Thanks again. – Sigularity Feb 02 '16 at 00:48
  • The example code shown in [this page](http://community.hpe.com/t5/Languages-and-Scripting/current-working-directory-of-process/td-p/5093802) seems plausible, but I did not test it. – Thomas Dickey Feb 02 '16 at 00:54