我正在运行多个 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: /