在 Linux 服务器中,经常会使用:
python3 app.py
启动 Python 程序。
但是运行一段时间后,通过:
ps -ef | grep app.py
查看进程时,可能只能看到:
root 17322 23123 0 Mar24 pts/12 05:28:54 python3 app.py
这里看不到:
- 使用的是哪个 Python 解释器
app.py文件实际在哪个目录
这时候可以通过 /proc 查看进程真实信息。
1. 查看 Python 解释器路径
先获取进程 PID:
PID = 17322
执行:
readlink -f /proc/17322/exe
输出:
/usr/local/python3.9.13/bin/python3.9
说明这个程序实际使用的 Python:
/usr/local/python3.9.13/bin/python3.9
而不是系统默认的:
/usr/bin/python3
2. 查看 app.py 所在目录
执行:
readlink -f /proc/17322/cwd
输出:
/root/newapi/222/fastapi2
这里表示程序启动时所在的工作目录。
因为启动命令是:
python3 app.py
所以实际运行的文件就是:
/root/newapi/222/fastapi2/app.py
3. 一条命令查看完整信息
以后遇到不知道路径的 Python 服务,可以执行:
PID=17322
echo "Python路径:"
readlink -f /proc/$PID/exe
echo "运行目录:"
readlink -f /proc/$PID/cwd
echo "启动命令:"
cat /proc/$PID/cmdline | tr '\0' ' '
输出类似:
Python路径:
/usr/local/python3.9.13/bin/python3.9
运行目录:
/root/newapi/222/fastapi2
启动命令:
python3 app.py
最终可以确定:
/usr/local/python3.9.13/bin/python3.9 /root/newapi/222/fastapi2/app.py
4. 为什么 uvicorn 可以直接看到路径?
例如:
uvicorn main:app --host 0.0.0.0 --port 6010
查看:
ps -ef | grep uvicorn
通常能看到:
/usr/local/bin/python3 /usr/local/bin/uvicorn main:app
原因是:
uvicorn 本身是一个可执行入口文件。
而:
python3 app.py
只是 Python 解释器加载脚本,Linux 进程参数只记录:
python3 app.py
不会自动展开成:
/usr/local/python3.9.13/bin/python3.9 /root/newapi/222/fastapi2/app.py
5. 生产环境建议
不要直接:
python3 app.py
建议使用绝对路径:
/usr/local/python3.9.13/bin/python3.9 \
/root/newapi/222/fastapi2/app.py
或者虚拟环境:
/root/newapi/venv/bin/python \
/root/newapi/222/fastapi2/app.py
这样以后查看:
ps -ef
就能快速确认运行环境。
总结
| 需求 | 命令 |
|---|---|
| 查看 Python 路径 | readlink -f /proc/PID/exe |
| 查看程序目录 | readlink -f /proc/PID/cwd |
| 查看启动参数 | cat /proc/PID/cmdline | tr '\0' ' ' |
Linux 中即使 ps 看不到完整路径,也可以通过 /proc/PID 精确找到 Python 程序真实运行位置。