杨先森的龙门阵 發表於 2025-11-27 09:42:33

通过Linux进程id找到程序路径的三种方法

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">方法一:最直观的方法 (ls)</a></li><li><a href="#_label1">方法二:最干净的方法 (readlink)</a></li><li><a href="#_label2">方法三:使用pwdx(注意区别)</a></li><li><a href="#_label3">特殊情况提示</a></li></ul></div><p>在 Linux 中,最直接、最可靠的方法是利用 <code>/proc</code> 文件系统。</p>
<p>假设你的进程 ID (PID) 是 <code>12345</code>,你可以使用以下几种方式:</p>
<p class="maodian"><a name="_label0"></a></p><h2>方法一:最直观的方法 (ls)</h2>
<p>Linux 的每个进程在 <code>/proc</code> 目录下都有一个对应的文件夹。<code>exe</code> 是一个符号链接,指向实际的二进制文件路径。</p>
<div class="jb51code"><pre class="brush:bash;">ls -l /proc/12345/exe
</pre></div>
<p><strong>输出示例:</strong></p>
<div class="jb51code"><pre class="brush:bash;">lrwxrwxrwx 1 root root 0 Nov 26 10:00 /proc/12345/exe -&gt; /opt/app/my_go_program
</pre></div>
<p>箭头 <code>-&gt;</code> 后面的 <code>/opt/app/my_go_program</code> 就是该程序的绝对路径。</p>
<p class="maodian"><a name="_label1"></a></p><h2>方法二:最干净的方法 (readlink)</h2>
<p>如果你只需要路径字符串(例如用于脚本中),可以使用 <code>readlink</code> 命令,它只输出目标路径,不包含其他信息。</p>
<div class="jb51code"><pre class="brush:bash;">readlink -f /proc/12345/exe
</pre></div>
<p><strong>输出示例:</strong></p>
<div class="jb51code"><pre class="brush:bash;">/opt/app/my_go_program
</pre></div>
<p class="maodian"><a name="_label2"></a></p><h2>方法三:使用pwdx(注意区别)</h2>
<p>有时候你可能想知道程序是在<strong>哪个目录下运行的</strong>(工作目录),而不是程序文件本身在哪里。这时用 <code>pwdx</code>:</p>
<div class="jb51code"><pre class="brush:bash;">pwdx 12345
</pre></div>
<p><strong>输出示例:</strong></p>
<div class="jb51code"><pre class="brush:bash;">12345: /home/user/data
</pre></div>
<p>这表示程序虽然可能在 <code>/usr/bin</code> 里,但它是在 <code>/home/user/data</code> 目录下被启动的。</p>
<p class="maodian"><a name="_label3"></a></p><h2>特殊情况提示</h2>
<p><strong><code>Permission denied</code></strong>:<br />如果进程属于其他用户(如 <code>root</code>),你需要加上 <code>sudo</code>:<br /><code>sudo ls -l /proc/12345/exe</code></p>
<p><strong>显示 <code>(deleted)</code></strong>:<br />如果你在 Go 程序运行时<strong>覆盖</strong>了二进制文件(例如发布新版本时直接 <code>cp</code> 覆盖),你可能会看到这样的输出:<br /><code>/opt/app/my_go_program (deleted)</code><br />这意味着内存中运行的进程对应的磁盘文件已经被删除了或替换了,但进程仍在运行旧版本的代码。</p>
頁: [1]
查看完整版本: 通过Linux进程id找到程序路径的三种方法