proc是虚拟文件系统,放在内存里面。
root@xxg_txy:~# ls /proc/
1 1114 13 15 18922 22 27 30153 35 435 78 8638 consoles interrupts kpageflags partitions sysvipc
10 1130 1303 16 18923 22846 270 3020 36 436 79 8639 cpuinfo iomem loadavg sched_debug thread-self
1018 1136 13219 166 18924 23 2709 30220 3669 437 7973 89 crypto ioports locks schedstat timer_list
10220 1137 13947 17 18925 23080 27712 30499 3693 438 8 9 devices irq mdstat scsi tty
1030 116 14 1768 18926 24 28 308 3695 439 80 979 diskstats kallsyms meminfo self uptime
1045 11748 14156 18 18927 24012 28662 3262 3696 441 81 98 dma kcore misc slabinfo version
1046 12 14162 18247 18928 24014 28912 327 3697 6 82 acpi driver keys modules softirqs version_signature
1056 12150 14163 18908 19 24015 29 328 3698 7 83 buddyinfo execdomains key-users mounts stat vmallocinfo
1061 12152 14209 18919 2 24401 2955 3312 3699 7388 8623 bus fb kmsg mtrr swaps vmstat
1073 12153 14281 18920 20 25 2996 3327 3700 7463 8628 cgroups filesystems kpagecgroup net sys zoneinfo
11 1299 14314 18921 21 26 30 34 4 7571 8636 cmdline fs kpagecount pagetypeinfo sysrq-trigger
数字对应进程id,里面存放的是一些进程信息,比如这里的1137:
root@xxg_txy:~# ls /proc/1137
attr clear_refs cpuset fd limits mem net oom_score personality schedstat smaps_rollup status timerslack_ns
autogroup cmdline cwd fdinfo loginuid mountinfo ns oom_score_adj projid_map sessionid stack syscall uid_map
auxv comm environ gid_map map_files mounts numa_maps pagemap root setgroups stat task wchan
cgroup coredump_filter exe io maps mountstats oom_adj patch_state sched smaps statm timers
exe是进程的执行文件,可以看到1137是一个nginx:
root@xxg_txy:~# ll /proc/1137/exe
lrwxrwxrwx 1 root root 0 Nov 27 15:19 /proc/1137/exe -> /usr/sbin/nginx*
用ps看下:
root@xxg_txy:~# ps aux | grep 1137
root 1137 0.0 0.1 33472 2060 ? Ss Oct19 0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
可以看到确实是nginx。
这里把proc的文件目录分为以下几部分:
1.进程信息,用数字命名的目录
2.硬件信息,只读,如cpuinfo,devices
3.内核,如interrupts,存放的是中断信息
进程信息
进程长什么样,全部都在这下面了。重点介绍下面几个:
cgroup
net
ns
cgroup
root@xxg_txy:/proc# cat 1137/cgroup
12:perf_event:/
11:hugetlb:/
10:devices:/system.slice/nginx.service
9:net_cls,net_prio:/
8:rdma:/
7:cpuset:/
6:cpu,cpuacct:/system.slice/nginx.service
5:pids:/system.slice/nginx.service
4:blkio:/system.slice/nginx.service
3:freezer:/
2:memory:/system.slice/nginx.service
1:name=systemd:/system.slice/nginx.service
0::/system.slice/nginx.service
cgroup后面会单独介绍一篇,这里先简单说一下。
进程下的cgroup文件记录了进程所属的cgroup信息,每行内容分三部分,用:隔开。
第一列是所属的cgroup树的id
第二列是和 cgroup 树绑定的所有 subsystem
第三列是进程在 cgroup 树中的路径
net
root@xxg_txy:/proc# ls 1137/net/
anycast6 dev_snmp6 if_inet6 ip6_mr_vif ip_tables_targets netlink ptype rt_acct sockstat6 udp wireless
arp fib_trie igmp ip_mr_cache ipv6_route netstat raw rt_cache softnet_stat udp6 xfrm_stat
connector fib_triestat igmp6 ip_mr_vif mcfilter packet raw6 snmp stat udplite
dev icmp ip6_flowlabel ip_tables_matches mcfilter6 protocols route snmp6 tcp udplite6
dev_mcast icmp6 ip6_mr_cache ip_tables_names netfilter psched rt6_stats sockstat tcp6 unix
顾名思义,net下存放的就是进程的网络信息。如果学了计算机网络,看到这些文件名称就很亲切了:各种协议的数据信息。比如ARP协议:
root@xxg_txy:/proc# cat 1137/net/arp
IP address HW type Flags HW address Mask Device
172.16.0.1 0x1 0x2 fe:ee:80:9f:32:47 * eth0
之后介绍docker网络时会涉及到。
ns
ns是namespace的简写,记录了进程所属的namespace信息。namespace后面也会单独拿一篇来介绍。
root@xxg_txy:/proc# ll 1137/ns
total 0
dr-x--x--x 2 root root 0 Dec 25 02:09 ./
dr-xr-xr-x 9 root root 0 Nov 27 15:18 ../
lrwxrwxrwx 1 root root 0 Dec 25 02:53 cgroup -> 'cgroup:[4026531835]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 ipc -> 'ipc:[4026531839]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 mnt -> 'mnt:[4026531840]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 net -> 'net:[4026531993]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 pid -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 pid_for_children -> 'pid:[4026531836]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 user -> 'user:[4026531837]'
lrwxrwxrwx 1 root root 0 Dec 25 02:53 uts -> 'uts:[4026531838]'
硬件信息
标识了系统的硬件信息,只读。这里简单介绍几个:
/proc/cpuinfo cpu的信息
/proc/meminfo 内存信息
/proc/devices 已经加载的设备
/proc/diskstats 硬盘信息
/proc/mounts 挂载信息
/proc/scsi/scsi SCSI设备信息
内核信息
还有一些文件是直接和内核打交道的,这里把它归类为内核信息。其中的一些文件是只读的,还有一些是可写的,即时生效。
比如/proc/sys下的文件是可修改的,修改后在整个系统的生命周期内都是有效的(除非重启),与之对应的命令是sysctl。
/proc/self/exe
这个文件是执行自己,用它可以实现一些特定的需求,看下面的例子:
package main
import (
"os/exec"
"syscall"
"os"
"fmt"
"time"
)
func main() {
if os.Args[0] == "/proc/self/exe" {
pid := syscall.Getpid()
fmt.Println("current 2 pid ", pid)
return
}
cmd := exec.Command("/proc/self/exe")
cmd.Stdout = os.Stdout
pid := syscall.Getpid()
fmt.Println("current 1 pid ", pid)
if err := cmd.Start(); err != nil {
fmt.Println(err)
}
time.Sleep(time.Second * 1)
}
运行后输出如下:
current 1 pid 14668
current 2 pid 14676
proc的介绍就到这里,谢谢阅读。