如何查找正在运行的进程的工作目录(HPUX / Solaris / Linux / AIX)

时间:2016-02-01 07:36:11

标签: unix process

尝试获取正在运行的进程的主目录。 对于Linux,我了解到我可以使用/ proc / PID / exe信息,但我认为其他操作系统中没有这些信息。

假设没有文件信息$ PATH,您能告诉我如何获取正在运行的进程的主目录吗? 我只需要假设OS实用程序的使用在操作系统中非常有限,这意味着我应该使用非常常见的命令。

条件: 没有像lsof这样的特殊用途。

我所指的流程是第三方应用程序运行的过程。

提前致谢。

1 个答案:

答案 0 :(得分:1)

ps -ef的第一列(POSIX中最常见的有用选项)为您提供流程所有者,通常是名称(有时只是uid编号)。对于 示例

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 

流程所有者名称(或uid编号)位于/etc/passwd中,作为第一列(名称)或第三列(uid编号)。 /etc/passwd中的列由冒号(:)分隔。例如:

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

在此示例中,statd

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

/etc/passwd的倒数第二列是流程的主目录,例如/var/lib/nfs进程的statd

某些系统进程没有主目录,例如,您可能会在Linux系统上看到/usr/sbin,或者多个进程共享的其他目录。

进一步阅读:

OP修正了一个问题,表明需要当前目录(而不是主目录)。使用proc文件系统的系统可以提供此信息。这些是Solaris,AIX和Linux。

但是,HPUX没有(请参阅例如/proc on HP-UX?,其中表示可以使用pstat系统调用。我看不到可能性,请阅读manual page,但下面的链接显示pstat_getpathname会有效。

根据{{​​3}},

AIX支持它。

在具有proc文件系统的系统中查找给定进程的工作目录的cwd“文件”。

进一步阅读: