如何找到 运行 进程 (HPUX/Solaris/Linux/AIX) 的工作目录
How to find a working directory of running process(HPUX/Solaris/Linux/AIX)
正在尝试获取 运行 进程的主目录。
对于 Linux,我了解到我可以使用 /proc/PID/exe 信息,但我认为其他 OS.
中没有该信息
假设没有文件信息$PATH,请问如何获取运行进程的主目录?
我只需要假设 OS 实用程序在 OS 中的使用非常有限,这意味着我应该使用非常常见的命令。
条件:
没有特殊的实用程序,例如 lsof.
已添加
我指的进程是第 3 方应用程序运行的进程。
提前致谢。
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
中作为第一列(对于 name)或第三列(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
的倒数第二列是进程的主目录,例如,statd
进程的 /var/lib/nfs
。
一些系统进程没有主目录,例如,您可能会在 Linux 系统上看到 /usr/sbin
,或者几个进程共享的其他目录。
延伸阅读:
- POSIX ps 显示 POSIX
ps
的选项,在这些系统中实现:
- HPUX ps
- Solaris ps
- Linux ps
- AIX ps
- passwd(5) 显示
/etc/passwd
的文件格式
OP 修改了问题以表明需要当前目录(而不是主目录)。使用 proc 文件系统的系统可以提供此信息。它们是 Solaris、AIX 和 Linux.
但是,HPUX 没有(参见示例 /proc on HP-UX?, which says the pstat
system-call can be used). I do not see a possibility, reading its manual page,但是下面的 link 说 pstat_getpathname
可以。
AIX 支持它,根据 IBM documentation。
在具有 proc 文件系统的系统中查找 cwd
"file" 给定进程的工作目录。
延伸阅读:
- Find out current working directory of a running process?
- current working directory of process
- Get full path of executable of running process on HPUX
- A sample of a program that can find itself (getcwd getenv)
正在尝试获取 运行 进程的主目录。 对于 Linux,我了解到我可以使用 /proc/PID/exe 信息,但我认为其他 OS.
中没有该信息假设没有文件信息$PATH,请问如何获取运行进程的主目录? 我只需要假设 OS 实用程序在 OS 中的使用非常有限,这意味着我应该使用非常常见的命令。
条件: 没有特殊的实用程序,例如 lsof.
已添加
我指的进程是第 3 方应用程序运行的进程。
提前致谢。
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
中作为第一列(对于 name)或第三列(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
的倒数第二列是进程的主目录,例如,statd
进程的 /var/lib/nfs
。
一些系统进程没有主目录,例如,您可能会在 Linux 系统上看到 /usr/sbin
,或者几个进程共享的其他目录。
延伸阅读:
- POSIX ps 显示 POSIX
ps
的选项,在这些系统中实现: - HPUX ps
- Solaris ps
- Linux ps
- AIX ps
- passwd(5) 显示
/etc/passwd
的文件格式
OP 修改了问题以表明需要当前目录(而不是主目录)。使用 proc 文件系统的系统可以提供此信息。它们是 Solaris、AIX 和 Linux.
但是,HPUX 没有(参见示例 /proc on HP-UX?, which says the pstat
system-call can be used). I do not see a possibility, reading its manual page,但是下面的 link 说 pstat_getpathname
可以。
AIX 支持它,根据 IBM documentation。
在具有 proc 文件系统的系统中查找 cwd
"file" 给定进程的工作目录。
延伸阅读:
- Find out current working directory of a running process?
- current working directory of process
- Get full path of executable of running process on HPUX
- A sample of a program that can find itself (getcwd getenv)