【问题标题】:How to find a working directory of running process(HPUX/Solaris/Linux/AIX)如何找到正在运行的进程的工作目录(HPUX/Solaris/Linux/AIX)
【发布时间】:2016-02-02 08:57:00
【问题描述】:

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

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

条件: 没有特殊的实用程序,例如 lsof。

添加

我所指的进程是第 3 方应用程序运行的进程。

提前致谢。

【问题讨论】:

    标签: unix process


    【解决方案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 中作为第一列(对于 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 的倒数第二列是进程的主目录,例如,/var/lib/nfs 表示statd 进程。

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

    进一步阅读:

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

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

    根据IBM documentation,AIX 支持它。

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

    进一步阅读:

    【讨论】:

    • 感谢您的详细解释。但是,我需要找到进程运行的位置,该进程不是本机操作系统进程。例如,如果有一个名为 run_it_first 的任何其他 3rd 方应用程序的进程,并且它是从 /usr/userapp/bin/run_it_first 启动的,我需要获取 '/usr/userapp/bin' 值。谢谢。
    • 这称为“当前工作目录”,而不是“主目录”。 Solaris 和 Linux 具有 proc 文件系统,您可以从中获取此信息(我不记得 HPUX 和 AIX 是可能的)。
    • 也许问题是指可执行文件的位置?
    • 嗨,@Thomas。感谢您的清晰解释。我正在寻找 pstat_getpathname 来完成这个要求。一旦完成,我想我可以分享它。再次感谢。
    • this page 中显示的示例代码看似合理,但我没有测试。
    猜你喜欢
    • 2012-04-30
    • 1970-01-01
    • 2010-09-09
    • 2010-09-10
    • 2018-04-25
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2013-09-13
    相关资源
    最近更新 更多