如何检测应用程序从哪里启动?

如何检测应用程序从哪里启动?

当我在命令行中输入某个可执行文件的名称并启动时,如何检测该可执行文件所在的路径?

答案1

您可以使用命令找出将启动哪个可执行文件

which <command>

如果您想以编程方式确定路径,那么您就走错了堆栈交换。

答案2

简单解决方案的问题

whichcommand查找给定的可执行文件command在你的 中$PATH。不幸的是,这并非在所有情况下都能按预期工作。

什么时候command是别名或函数,您将无法获得正确的结果,因为实际运行的可执行文件可能具有完全不同的名称。例如,许多 Linux 发行版ll默认设置了别名。which ll找不到任何内容。另一个有问题的情况是,当您的 shell 以非标准方式运行并且不运行第一个command发现于$PATH

更可靠的解决方案

在 Linux 上,如果你想完全确定正在运行的进程的可执行文件的路径,那么你可以从其PID(进程 ID;在下面的示例中用数字代替$PID):

readlink /proc/$PID/exe

如何獲得號碼?PIDshell 后台运行的最后一个进程是$!。小演示:

sleep 20 &
readlink /proc/$!/exe

你可以得到PID例如从进程列表中使用其他进程ps -ef

解释:/proc/$PID/exe是指向可执行文件的符号链接跑步进程。该命令readlink显示符号链接指向的目标。

脚本是一种特殊情况

不幸的是,该readlink /proc/$PID/exe方法对于 bash、Perl、Python 等脚本语言不起作用。在这种情况下,您将获得脚本解释器的路径(如/bin/bash),而不是脚本的路径。要获取更接近的信息,您可以使用:

cat /proc/$PID/cmdline     # the commandline with the interpreter and script
readlink /proc/$PID/cwd    # the current working directory

不幸的是,当前工作目录可能会在程序启动后发生变化。一些解释器(如 bash)可以让脚本文件在描述符 255 上保持打开状态:

readlink /proc/$PID/fd/255

一切都可能改变

任何进程都可以调用exec()来替换其/proc/$PID/exe/proc/$PID/cmdline以及其他信息。

相关内容