找出进程执行的位置

找出进程执行的位置

我正在运行多个 ruby​​ 进程:

ps -A | grep ruby 
 3518 ?        00:00:12 ruby
10316 ?        00:00:00 ruby
22400 pts/5    00:00:45 ruby
23332 ?        00:00:07 ruby

我得到了上面的 pid,但我想知道这些进程在文件系统中的位置。换句话说,它们在哪里执行的。

我为什么想知道?我有一个守护进程在 byobu 屏幕中运行,我想知道它是从哪里执行的。

byobu new -s daemon
ls -l
  -rwxrwxr-x 1 someuser someuser   83 Jul  2 11:13 db_service.sh
cat db_service.sh
  #!/bin/sh
  RAILS_ENV=production bundle exec ruby lib/daemons/db_service_ctl start
./script/db_service.sh

因此,正如您从上面的 bash 命令中看到的那样,从 db_service.sh shell 脚本中生成了一个守护进程(ruby on rails 守护进程)。那么它是从文件系统中的哪个位置生成的呢?ps 能帮我吗?或者 Linux 中有没有更好的程序可以找到所需的信息?我不是在寻找 ruby​​ 安装的路径,而是在寻找 ruby​​ 实例的执行路径

答案1

获得进程 ID 后,您就可以查看/proc/虚拟文件系统。一切都在那里。例如

  • /proc/23124/cwd- 进程 23124 的当前目录
  • /proc/23124/cmdline- 该过程的完整命令行。

答案2

尽管/proc上面已经简要提到过它是了解系统进程的信息来源,但我还是在这里提供了一个基本的 Bash 脚本来解析其中的一些信息。有关/proc虚拟文件系统的出色介绍,请参阅这篇 IBM 文章,解释了它如何对用户和程序员都有用。

使用通用脚本进行解析/proc可能不可靠,因为不同的进程通常具有不同的/proc布局,但通常可以使用此脚本收集基本信息,尽管如果您想解析任何其他特定信息,则可能需要对其进行修改。我使用 Bash 编写了它,但如果您想使用其他脚本语言编写它,您可以研究更好的解析器。

通常在脚本的输出中您可能会看到“权限被拒绝”消息,这意味着该/proc位置不可被 $USER 读取,因此如果您想在这种情况下获得完整的输出,您可以以 root 身份运行该脚本。

将脚本主体复制到新文件中,保存并使其可执行(chmod u+x),然后使用至少一个参数调用它(它现在可以同时处理多个进程):

./proc_script xfce4-panel

或者将它放入你的$HOME/bin,然后如果$HOME/bin它在你的路径中,你就可以像其他程序一样运行它。(但是,如果你使用 sudo,你仍然必须提供脚本的绝对路径位置,因为它$HOME/bin不在 root 的路径中。)

脚本主体;也可以在以下位置获取和更新:我的 Github 页面

#!/usr/bin/env bash  

(( $# == 0 )) && { printf "Usage: Please specify the name of one process \
to research.\n" >&2; exit 1; }

args=("$@")                   
for process in "${args[@]}"; do                    
    # store user input in a variable and warn then exit if program is not running
    queried_pid="$(pgrep "${process}" || { printf '%s\n' "No such program" >&2; })"

    # add the contents of the variable into an array
    pidarray=($(echo "$queried_pid"))

    # iterate over the array, however many pids have been found
    for i in "${pidarray[@]}"; do 
        printf "Pid is: %s\nExe is: %s\nCmdline is: %s\ncwd is: %s\n" "$(echo "$i")" \
    "$(stat -c %N /proc/"$i"/exe)" "$(cat /proc/"$i"/cmdline)" "$(cd /proc/"$i"/cwd/; pwd -P)"
    done
    printf "\n\n"
done

exit 

示例输出1:

./proc_parse firefox


Pid is: 1830
Exe is: `/proc/1830/exe' -> `/usr/lib/firefox/firefox'
Cmdline is: /usr/lib/firefox/firefox
cwd is: /home/mike

示例输出 2(处理多个 pid):

./proc_parse evince

Pid is: 3113
Exe is: `/proc/3113/exe' -> `/usr/bin/evince'
Cmdline is: evince/home/mike/Z_IBM_lpic_Linux_pdfs/l-proc-pdf.pdf
cwd is: /home/mike
Pid is: 3119
Exe is: `/proc/3119/exe' -> `/usr/lib/evince/evinced'
Cmdline is: /usr/lib/evince/evinced
cwd is: /

相关内容