1. 查看进程打开了哪些文件
-
定义
在 Linux 系统里,每个进程都有与之对应的 /proc
目录,该目录存有该进程的各类信息。其中,/proc/<pid>/fd
目录存放着此进程打开的所有文件描述符,每个文件描述符指向一个打开的文件。通过查看这个目录,就能知晓进程打开了哪些文件。
-
要点
/proc
文件系统属于虚拟文件系统,用于提供内核和进程的信息。/proc/<pid>/fd
目录下的文件描述符链接指向实际打开的文件。
-
应用
在排查系统资源使用问题、调试程序时,了解进程打开的文件很有帮助。比如,若程序出现文件读写错误,可查看进程打开的文件是否正确。
-
代码示例
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ProcessOpenFiles {
public static void main(String[] args) {
int pid = 1234; // 需替换为实际的进程 ID
try {
Process process = Runtime.getRuntime().exec("ls -l /proc/" + pid + "/fd");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
2. Linux 如何查看端口被哪个进程占用
-
定义
在 Linux 系统中,可借助 netstat
或 ss
命令查看网络连接信息,其中包含端口和对应的进程。这些命令会列出所有网络连接,通过过滤指定端口,就能找出占用该端口的进程。此外,lsof
命令也能直接查看指定端口被哪个进程占用。
-
要点
netstat
和ss
命令可用于查看网络连接信息。lsof
命令能直接查看指定端口对应的进程。
-
应用
在启动新服务时,若端口被占用,可通过此方法找出占用端口的进程,然后决定是否关闭该进程以释放端口。
-
代码示例
java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class PortOccupiedProcess {
public static void main(String[] args) {
int port = 8080; // 需替换为实际的端口号
try {
Process process = Runtime.getRuntime().exec("lsof -i :" + port);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
reader.close();
process.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}
3. top 常用指令