lsof fd mem类型 -回复
linux--查看文件占用(lsof)

linux--查看⽂件占⽤(lsof)linux--查看⽂件占⽤(lsof)1 简介2 lsof2.1 简介lsof可以打开的⽂件2.2 ⽤法2.3 ⽰例在终端下输⼊lsof即可显⽰系统打开的⽂件(root权限)查看某端⼝运⾏情况查看所属root⽤户进程所打开的⽂件类型为txt的⽂件查看谁使⽤该⽂件恢复删除的⽂件(摘⾃3)参考1 简介⼀个⽂件可能被多个进程操作,linux查看⽂件被哪些进程操作,可使⽤lsof命令。
2 lsof2.1 简介lsof(list open files)是⼀个列出当前系统打开⽂件的⼯具。
在linux环境下,任何事物都以⽂件的形式存在,通过⽂件不仅仅可以访问常规数据,还可以访问⽹络连接和硬件。
所以如传输控制协议 (TCP) 和⽤户数据报协议 (UDP) 套接字等,系统在后台都为该应⽤程序分配了⼀个⽂件描述符,⽆论这个⽂件的本质如何,该⽂件描述符为应⽤程序与基础操作系统之间的交互提供了通⽤接⼝。
因为应⽤程序打开⽂件的描述符列表提供了⼤量关于这个应⽤程序本⾝的信息,因此通过lsof⼯具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof可以打开的⽂件普通⽂件⽬录⽹络⽂件系统的⽂件字符或设备⽂件(函数)共享库管道,命名管道符号链接⽹络⽂件(例如:NFS file、⽹络socket,unix域名socket)还有其它类型的⽂件,等等2.2 ⽤法lsof [options] filename常⽤如下列表:lsof filename 显⽰打开指定⽂件的所有进程lsof -a 表⽰两个参数都必须满⾜时才显⽰结果lsof -c string 显⽰COMMAND列中包含指定字符的进程所有打开的⽂件lsof -u username 显⽰所属user进程打开的⽂件lsof -g gid 显⽰归属gid的进程情况lsof +d /DIR/ 显⽰⽬录下被进程打开的⽂件lsof +D /DIR/ 同上,但是会搜索⽬录下的所有⽬录,时间相对较长lsof -d FD 显⽰指定⽂件描述符的进程lsof -n 不将IP转换为hostname,缺省是不加上-n参数lsof -i ⽤以显⽰符合条件的进程情况lsof -i[46] [protocol][@hostname|hostaddr][:service|port]46 --> IPv4 or IPv6protocol --> TCP or UDPhostname --> Internet host namehostaddr --> IPv4地址service --> /etc/service中的 service name (可以不只⼀个)port --> 端⼝号 (可以不只⼀个)2.3 ⽰例在终端下输⼊lsof即可显⽰系统打开的⽂件(root权限)lsof | grep qtCOMMAND PID USER FD TYPE DEVICE SIZE NODE NAMEsogou-qim 1469 meg mem REG 8,1 353944 396899 /usr/lib/x86_64-linux-gnu/qt4/plugins/accessible/libqtaccessiblewidgets.so sogou-qim 1469 meg mem REG 8,1 261944 396900 /usr/lib/x86_64-linux-gnu/qt4/plugins/accessiblebridge/libqspiaccessiblebridge.so sogou-qim 1469 meg mem REG 8,1 31592 396915 /usr/lib/x86_64-linux-gnu/qt4/plugins/imageformats/libqtiff.sosogou-qim 1469 meg mem REG 8,1 23128 396914 /usr/lib/x86_64-linux-gnu/qt4/plugins/imageformats/libqtga.sosogou-qim 1469 meg mem REG 8,1 27568 396913 /usr/lib/x86_64-linux-gnu/qt4/plugins/imageformats/libqmng.sosogou-qim 1469 meg mem REG 8,1 31696 396912 /usr/lib/x86_64-linux-gnu/qt4/plugins/imageformats/libqjpeg.sosogou-qim 1469 meg mem REG 8,1 31504 396911 /usr/lib/x86_64-linux-gnu/qt4/plugins/imageformats/libqico.sosogou-qim 1469 meg mem REG 8,1 31440 396910 /usr/lib/x86_64-linux-gnu/qt4/plugins/imageformats/libqgif.sohud-servi 1517 meg mem REG 8,1 361960 396977 /usr/lib/x86_64-linux-gnu/qt5/plugins/platformthemes/libappmenu-qt5.so COMMAND:进程的名称PID:进程标识符USER:进程所有者FD:⽂件描述符,应⽤程序通过⽂件描述符识别该⽂件。
lsof查看程序打开的句柄数

lsof 查看程序打开的句柄数lsof-查看程序打开的句柄数2010-06-19 17:15lsof命令简介lsof简介lsof(list open files)是一个列出当前系统打开文件的工具。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。
所以如传输控制协议(tcp)和用户数据报协议(udp)套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。
因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof使用lsof输出信息含义在终端下输入lsof即可显示系统打开的文件,因为lsof需要访问核心内存和各种文件,所以必须以root用户的身份运行它才能够充分地发挥其功能。
command pid user fd type device size node name init 1root cwd dir 3,3 1024 2/init 1root rtd dir 3,3 1024 2/init1root txt reg 3,3 38432 1763452/sbin/init init 1root mem reg 3,3 106114 1091620/lib/libdl-2.6.so init 1root mem reg 3,3 7560696 1091614/lib/libc-2.6.so init 1root mem reg 3,3 794601091669/lib/libselinux.so.1 init 1root mem reg 3,3 2232801091668/lib/libsepol.so.1 init 1root mem reg 3,3 5641361091607/lib/ld-2.6.so init 1root 10u fifo 0,15 1309/dev/initctl每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。
lsof详解

lsof简介lsof(list open files)是一个列出当前系统打开文件的工具。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。
所以如传输控制协议(TCP) 和用户数据报协议(UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。
因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
lsof使用lsof输出信息含义在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。
COMMAND PID USER FD TYPE DEVICE SIZENODE NAMEinit 1 root cwd DIR 3,3 1024 2 /init 1 root rtd DIR 3,3 1024 2 /init 1 root txt REG 3,3 384321763452 /sbin/initinit 1 root mem REG 3,3 1061141091620 /lib/libdl-2.6.soinit 1 root mem REG 3,3 75606961091614 /lib/libc-2.6.soinit 1 root mem REG 3,3 794601091669 /lib/libselinux.so.1init 1 root mem REG 3,3 2232801091668 /lib/libsepol.so.1init 1 root mem REG 3,3 5641361091607 /lib/ld-2.6.soinit 1 root 10u FIFO 0,151309 /dev/initctl每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。
Linux启动过程详解_MBR和GRUB概述

MBR和GRUB概述Linux 的启动流程目前比较流行的方式主要是以下步骤:1、引导器(例如 GRUB)启动;2、内核启动;3、系统进程启动与配置。
本文以 GRUB 为研究对象,对 GRUB 启动与内核启动两个部分进行描述,关于系统进程的进一步启动与配置将用另一篇文章来说明。
常见的目录结构(以 CentOS 5.3 为例):/boot|-- System.map-2.6.18-128.el5|-- System.map-2.6.18-128.el5xen|-- config-2.6.18-128.el5|-- config-2.6.18-128.el5xen|-- initrd-2.6.18-128.el5.img|-- initrd-2.6.18-128.el5xen.img|-- lost+found|-- memtest86+-1.65|-- message|-- symvers-2.6.18-128.el5.gz|-- symvers-2.6.18-128.el5xen.gz|-- vmlinuz-2.6.18-128.el5|-- vmlinuz-2.6.18-128.el5xen|-- xen-syms-2.6.18-128.el5|-- xen.gz-2.6.18-128.el5`-- grub|-- device.map|-- e2fs_stage1_5|-- fat_stage1_5|-- ffs_stage1_5|-- grub.conf|-- iso9660_stage1_5|-- jfs_stage1_5|-- menu.lst -> ./grub.conf|-- minix_stage1_5|-- reiserfs_stage1_5|-- splash.xpm.gz|-- stage1|-- stage2|-- ufs2_stage1_5|-- vstafs_stage1_5`-- xfs_stage1_5图一: CentOS 5.3 的 /boot 目录目录分作两大部分,一个是 /boot 目录下除 grub 目录以外的所有文件,这些是 Linux 的内核以及内核启动相关的一些文件;另一个就是 grub 下的所有文件, GRUB 引导器启动所需要的所有文件都在 grub 目录下。
每天一个linux命令(38)--lsof之FD文件描述符

每天⼀个linux命令(38)--lsof之FD⽂件描述符 ⼀般lsof 会输出以下这些信息: COMMAND: 进程的名称 PID:进程标识符 PPID:⽗进程标识符(需要指定-R参数) USER:进程所有者 PGID:进程所属组 FD:⽂件描述符,应⽤程序通过⽂件描述符识别该⽂件。
TYPE:⽂件类型。
如 DIR、REG等 DEVICE:指定磁盘的名称 SIZE:⽂件的⼤⼩ NODE:索引节点(⽂件在磁盘上的标识) NAME:打开⽂件的确切名称 这篇重点是讲⼀下FD⽂件描述符,因为在lsof 中这个内容占了很⼤的⼀个篇幅,我⼜⼀向崇尚精简,所以把它单独拿了出来学习。
FD: (1)cwd:表⽰ current work dirctory,即:应⽤程序的当前⼯作⽬录,这是该应⽤程序启动的⽬录,除⾮它本⾝对这个⽬录进⾏更改 (2)txt:该类型的⽂件是程序代码,如应⽤程序⼆进制⽂件本⾝或共享库,如上列表中显⽰的 /sbin/init 程序 (3)lnn: library references (AIX) (4)er: FD information error (see NAME column) (5)jld: jail directory(FreeBSD) (6)ltx: shared library text(code and data) (7)mxx: hex memory-mapped type number xx. (8)m86:DOS Merge mapped file (9) mem: memory-mapped file (10)mmap: memory-mapped device (11)pd: parent directory (12)rtd: root directory (13)tr: kernel trace file (OpenBSD) (14)v86 VP/ix mapped file (15)0:表⽰标准输出 (16)1:表⽰标准输⼊ (17)2:表⽰标准错误 ⼀般在标准输出、标准错误、标准输⼊后还跟着⽂件状态模式:r w u 等 (1)u:表⽰该⽂件被打开并处于读取/写⼊模式 (2)r:表⽰该⽂件被打开并处于只读模式 (3)w:表⽰该⽂件被打开并处于只写⼊模式 (4)空格:表⽰该⽂件的状态模式为 unknown ,且没有锁定 (5)- : 表⽰该⽂件的状态模式为 unknown ,且被锁定 同时在⽂件状态模式后⾯,还跟着相关的锁 (1)N:for a Solaris NFS lock of unknown type (2)r: for a read lock on part of the file (3)R:for a read lock on the entire file (4)w: for a write lock on part of the file (⽂件的部分写锁) (5)W: for a write lock on the entire file(整个⽂件的写锁) (6)u: for a read and write lock of any length (7)U: for a lock of unknown type (8)x: for an SCO OpenServer Xenix lock on part of the file (9)X:for an SCO OpentServer Xenix lock on the entire file (10)space : if there is no lock。
第6章:使用Python监控Linux系统

第6章:使⽤Python监控Linux系统1.Python编写的监控⼯具1).多功能系统资源统计⼯具dstatdstat是⼀个⽤Python编写的多功能系统资源统计⼯具,⽤来取代Linux下的vmstat,iostat,netstat和ifstat等命令dstat可以在⼀个界⾯上展⽰⾮常全⾯的监控信息# yum install dstat# dstat 2 10dstat的强⼤之处不仅仅是因为它聚合了很多种⼯具的监控结果,还因为它能通过附带的插件实现⼀些⾼级功能,如找出占⽤资源最⾼的进程和⽤户dstat的--top-(io|bio|cpu|cputime|cputime-avg|mem)这⼏个选项可以看到具体是哪个⽤户和哪个进程占⽤了相关系统资源,对系统调优⾮常有效# dstat --top-mem --top-io --top-cpu# dstat -a --output dstat_utput.csv2).交互式监控⼯具glancesglances是⼀款使⽤Python开发的,基于psutil的跨平台系统监控⼯具glances可以在⽤户终端上实时显⽰重要的系统信息,并动态刷新内容# pip install glances# glances类似top命令的交互式界⾯# pip install Bottle# glances -w2.使⽤Python打造⾃⼰的监控⼯具1).Linux系统的/proc⽬录介绍Linux系统将监控数据保存在proc⽬录下proc⽬录是⼀个控制中⼼,⽤户可以通过更改其中某些⽂件来改变内核的运⾏状态2).proc⽬录下常⽤⽂件介绍/proc/loadavg/proc/meminfo/proc/diskstats/proc/net/dev/proc/cpuinfo3).进程⽬录下常⽤⽂件介绍proc⽬录下有很多名字为数字的⽬录,⽬录的名称与进程的id对应4).利⽤/proc⽬录找到被删除的⽂件由于有进程(MySQL进程)打开了该⽂件,当我们从外部执⾏删除命令时⽂件并没有被真正的删除只有当进程关闭该⽂件的句柄时,⽂件才会被真正删除可以使⽤lsof命令查看已经被删除的⽂件[root@kettle1 test]# lsof | grep tt.ibdmysqld 2933 mysql 37uW REG 253,0 98304 524406 /app/mysqldata/3306/data/test/tt.ibd (deleted)虽然从⽂件系统层⾯已经⽆法找到被删除的⽂件,我们还可以在proc⽬录下找到该⽂件的⽂件句柄[root@kettle1 fd]# ll /proc/2933/fd/37lrwx------. 1 root root 64 Aug 10 16:34 /proc/2933/fd/37 -> /app/mysqldata/3306/data/test/tt.ibd (deleted)为了恢复出⼀个⼀致性的数据⽂件,可以先在MySQL数据库中为该表加上表锁,以免在恢复⽂件的过程中还有新的写⼊(root@localhost) [test]> lock table tt read;Query OK, 0 rows affected (0.00 sec)恢复的⽅式也很简单,直接对⽂件句柄进⾏cp即可[root@kettle1 fd]# cp /proc/2933/fd/37 /app/mysqldata/3306/data/test/tt.ibd[root@kettle1 fd]# chown mysql:mysql /app/mysqldata/3306/data/test/tt.ibd重启数据库5).使⽤shell脚本监控Linux# cat monitor.sh 在CentOS7上的监控cpu_idle=$(top -n2 | grep 'Cpu' | tail -n 1 | awk '{ print $8 }')cpu_usage=$(echo "100 - $cpu_idle" | bc)mem_free=$(free -m | awk '/Mem:/{ print $7}')mem_total=$(free -m | awk '/Mem:/{ print $2}')mem_used=$(echo "$mem_total - $mem_free" | bc)mem_rate=$(echo "$mem_used * 100 / $mem_total" | bc)disk_usage=$(df -h / | tail -n 1 | awk '{ print $5 }')disk_used=$(df -h / | tail -n 1 | awk '{ print $3 }')echo "cpu利⽤率: $cpu_usage %"echo "内存使⽤量: $mem_used M"echo "内存利⽤率: $mem_rate %"echo "磁盘空间使⽤量: $disk_used"echo "磁盘空间利⽤率: $disk_usage"6).使⽤Python监控Linux使⽤Python监控Linux磁盘IO# -*- coding: UTF-8 -*-from collections import namedtupleDisk = namedtuple('Disk', 'major_number minor_number device_name read_count read_merged_count read_sections time_spent_reading write_count write_merged_count write_sections time_spent_write io_requests time_spent_doing_io weighted def get_disk_info(device):with open("/proc/diskstats") as f:for line in f:if line.split()[2] == device:return Disk(*(line.split()))raise RuntimeError("device ({0}) not found!".format(device))def main():disk_info = get_disk_info('sda')print(disk_info)print("磁盘写次数:{0}".format(disk_info.write_count))print("磁盘写字节数:{0}".format(long(disk_info.write_sections)*512))print("磁盘写延时:{0}".format(disk_info.time_spent_write))if__name__ == '__main__':main()3.使⽤开源库监控Linux1).psutil介绍psutil是⼀个开源且跨平台的库,其提供了便利的函数⽤来获取操作系统的信息,如cpu,内存,磁盘,⽹络等信息psutil可以⽤来进⾏进程管理,包括判断进程是否存在、获取进程列表、获取进程的详细信息等psutil⼴泛应⽤于系统监控、进程管理、资源限制等场景# pip install psutil2).psutil提供的功能函数与cpu相关的功能函数cpu_count默认返回逻辑cpu的个数import psutilpsutil.cpu_count()psutil.cpu_count(logical=False)cpu_percent返回cpu的使⽤率import psutilpsutil.cpu_percent()psutil.cpu_percent(percpu=True)psutil.cpu_percent(interval=2,percpu=True)virtual_memory以命名元组的形式返回内存使⽤情况,包括总内存、可⽤内存、内存使⽤率、buffer和cached等import psutilpsutil.virtual_memory()def bytes2human(n):symbols = ('K','M','G','T','P')prefix = {}for i,s in enumerate(symbols):prefix[s] = 1 << (i+1) * 10for s in reversed(symbols):if n >= prefix[s]:value = float(n) / prefix[s]return'%.1f%s' % (value,s)return"%sB" %nbytes2human(psutil.virtual_memory().total)swap_memory以命名元组的形式返回swap memory的使⽤情况psutil.swap_memory()与磁盘相关的功能函数disk_partitions返回所有已经挂载的磁盘,包含磁盘名称、挂载点、⽂件系统类型等信息psutil.disk_partitions()disk_usage获取磁盘的使⽤情况,包括磁盘的容量、已经使⽤的磁盘容量、磁盘的空间利⽤率等psutil.disk_usage('/')disk_io_counters返回磁盘io统计信息,包括读的次数、写的次数、读写字节、写字节等psutil.disk_io_counters()与⽹络相关的功能函数net_io_counter返回每块⽹卡的⽹络io的统计信息,包括收发字节数、收发包的数量、出错情况与删包情况_io_counters()net_connections返回每个⽹络链接的详细信息_connections()net_if_addrs返回⽹卡的配置信息,包括ip地址,mac地址,⼦⽹掩码和⼴播地址3).综合案例:使⽤psutil实现监控程序使⽤psutil收集了cpu的信息,开机时间,内存信息以及磁盘空间等信息,以及磁盘io与⽹络io信息import osimport socketfrom datetime import datetimeimport psutilimport jinja2import yagmailEMAIL_USER = 'hugaochao320@'EMAIL_PASSWORD = 'hgc3177678'RECIPIENTS = ['hugc@']def render(tpl_path, **kwargs):path, filename = os.path.split(tpl_path)return jinja2.Environment(loader=jinja2.FileSystemLoader(path or'./')).get_template(filename).render(**kwargs) def bytes2human(n):symbols = ('K','M','G','T','P')prefix = {}for i,s in enumerate(symbols):prefix[s] = 1 << (i + i) * 10for s in reversed(symbols):if n >= prefix[s]:value = float(n) / prefix[s]return'%.1f%s' % (value, s)return"%sB" % ndef get_cpu_info():cpu_count = psutil.cpu_count()cpu_percent = psutil.cpu_percent(interval=1)return dict(cpu_count=cpu_count, cpu_percent=cpu_percent)def get_memory_info():virtual_mem = psutil.virtual_memory()mem_total = bytes2human(virtual_mem.total)mem_percent = virtual_mem.percent#mem_free = bytes2human(virtual_mem.free + virtual_mem.buffers + virtual_mem.cached)mem_free = bytes2human(virtual_mem.available)#mem_used = bytes2human(virtual_mem.total * virtual_mem.percent)mem_used = bytes2human(virtual_ed)return dict(mem_total=mem_total, mem_percent=mem_percent, mem_free=mem_free, mem_used=mem_used) def get_disk_info():disk_usage = psutil.disk_usage('/')disk_total = bytes2human(disk_usage.total)disk_percent = disk_usage.percentdisk_free = bytes2human(disk_usage.free)disk_used = bytes2human(disk_ed)return dict(disk_total=disk_total, disk_percent=disk_percent, disk_free=disk_free, disk_used=disk_used)def get_boot_info():boot_time = datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")return dict(boot_time=boot_time)def collect_monitor_data():data = {}data.update(get_boot_info())data.update(get_cpu_info())data.update(get_memory_info())data.update(get_disk_info())return datadef main():hostname = socket.gethostname()data = collect_monitor_data()data.update(dict(hostname=hostname))content = render('monitor.html', **data)with yagmail.SMTP(user=EMAIL_USER, password=EMAIL_PASSWORD, host='', port=465) as yag: for recipient in RECIPIENTS:yag.send(recipient, "monitor information".encode('utf-8'), content.encode('utf-8'))if__name__ == '__main__':main()4.使⽤pyinotify监控⽂件系统变化1).pyinotify模块介绍pyinotify⽤来检测⽂件系统变化inotify是⼀个事件驱动的通知器pip install pyinotifypython -m pyinotify /tmp2).pyinotify模块APIpyinotify模块APIWatchManager保存了需要监视的⽂件和⽬录,以及监视⽂件和⽬录的哪些事件import pyinotifywm = pyinotify.WatchManager()wm.add_watch('/tmp', pyinotify.ALL_EVENTS)notifier = pyinotify.Notifier(wm)notifier.loop()仅监视创建和删除事件import pyinotifywm = pyinotify.WatchManager()mask = pyinotify.IN_DELETE | pyinotify.IN_CREATEwm.add_watch('/tmp', mask)notifier = pyinotify.Notifier(wm)notifier.loop()3).事件标志与事件处理器事件标志事件含义IN_CREATE 在被监控⽬录中创建⼦⽬录或⽂件IN_DELETE 在被监控⽬录中有⼦⽬录或⽂件被删除IN_MODIFY 被监控⽬录中的条⽬被修改IN_MOVE...import pyinotifywm = pyinotify.WatchManager()mask = pyinotify.IN_DELETE | pyinotify.IN_CREATEclass EventHandler(pyinotify.ProcessEvent):def process_IN_CREATE(self, event):print("Creating:", event.pathname)def process_IN_DELETE(self, event):print("Removing:", event.pathname)handler = EventHandler()notifier = pyinotify.Notifier(wm, handler)wdd = wm.add_watch('/tmp', mask, rec=True)notifier.loop()5.监控应⽤程序1).使⽤Python监控MySQL数据库作为应⽤程序的核⼼组件,⼀般都需要进⾏细粒度的监控以MySQL数据库为例:对MySQL数据库的监控应该包括数据库连接数、qps、tps、Buffer Pool命中率、复制延迟、Binlog⽂件⼤⼩等2).使⽤Python监控MongoDBMongoDB本⾝就返回⼀个数据字典from__future__import print_functionimport pymongoclient = pymongo.MongoClient(host='127.0.0.1:27017')client.admin.authenticate('laimingxing','laimingxing')rs = mand('replSetGetStatus')print("set:",rs['set'])print("myState:",rs['myState'])print("num of members:",len(rs['members']))。
lsof命令详解

lsof命令详解lsof (list open files)是⼀个列出当前系统打开⽂件的⼯具。
在linux系统环境下,任何事物都可以以⽂件形式存在,通过⽂件不仅可以访问常规的数据,还可以访问⽹络连接和硬件。
适应条件:lsof访问的是核⼼⽂件和各种⽂件,所以必须以root⽤户的⾝份运⾏才能充分发挥其功能。
lsof [选项] [绝对路径的⽂件名]显⽰⽰例[root@localhost ~]# lsof /usr/sbin/httpdCOMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEhttpd 6279 root txt REG 8,2 344112 415135 /usr/sbin/httpdhttpd 6281 apache txt REG 8,2 344112 415135 /usr/sbin/httpdhttpd 6282 apache txt REG 8,2 344112 415135 /usr/sbin/httpdhttpd 6283 apache txt REG 8,2 344112 415135 /usr/sbin/httpdhttpd 6284 apache txt REG 8,2 344112 415135 /usr/sbin/httpdhttpd 6285 apache txt REG 8,2 344112 415135 /usr/sbin/httpdhttpd 6286 apache txt REG 8,2 344112 415135 /usr/sbin/httpdhttpd 6287 apache txt REG 8,2 344112 415135 /usr/sbin/httpdhttpd 6288 apache txt REG 8,2 344112 415135 /usr/sbin/httpdhttpd 6546 apache txt REG 8,2 344112 415135 /usr/sbin/httpd每⾏显⽰⼀个打开的⽂件,默认如果后⾯不跟任何东西,将打开系统打开的所有⽂件COMMAND :进程名称PID:进程标识符USER:进程所有者FD:⽂件描述符,应⽤程序通过⽂件描述符识别到该⽂件。
Linuxlsof命令详解

Linuxlsof命令详解⼀、lsof命令介绍 lsof(list open files)命令可以列出当前系统已经打开的所有⽂件。
在Linux环境下,任何事物都以⽂件的形式存在,通过⽂件不仅仅可以访问常规数据,还可以访问⽹络连接和硬件。
所以如传输控制协议 (TCP) 和⽤户数据报协议 (UDP) 套接字等,系统在后台都为该应⽤程序分配了⼀个⽂件描述符,⽆论这个⽂件的本质如何,该⽂件描述符为应⽤程序与基础操作系统之间的交互提供了通⽤接⼝。
因为应⽤程序打开⽂件的描述符列表提供了⼤量关于这个应⽤程序本⾝的信息,因此通过lsof⼯具能够查看这个列表,这对系统监测以及排错是很有帮助的。
⼆、lsof输出含义 在终端下输⼊lsof命令即可显⽰系统所有已经打开的⽂件,因为lsof需要访问核⼼内存和各种⽂件,所以必须以 root ⽤户的⾝份运⾏它才能够充分地发挥其功能。
直接输⼊lsof部分输出为:COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEinit 1 root cwd DIR 8,140962 /init 1 root rtd DIR 8,140962 /init 1 root txt REG 8,1150584654127 /sbin/initudevd 415 root 0u CHR 1,3 0t0 6254 /dev/nulludevd 415 root 1u CHR 1,3 0t0 6254 /dev/nulludevd 415 root 2u CHR 1,3 0t0 6254 /dev/nulludevd 690 root mem REG 8,151736302589 /lib/x86_64-linux-gnu/libnss_files-2.13.sosyslogd 1246 syslog 2w REG 8,110187245418 /var/log/auth.logsyslogd 1246 syslog 3w REG 8,110118245342 /var/log/syslogdd1271 root 0r REG 0,304026532038 /proc/kmsgdd1271 root 1w FIFO 0,15 0t0 409 /run/klogd/kmsgdd1271 root 2u CHR 1,3 0t0 6254 /dev/null每⾏显⽰⼀个已经打开的⽂件,若不指定条件默认将显⽰所有进程打开的所有⽂件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
lsof fd mem类型-回复
lsof是一款用于列出当前系统打开文件的命令。
而在lsof命令的输出结果中,我们常常会看到一种称为fd mem的类型。
在本文中,我们将详细介绍fd mem类型以及它在计算机系统中的作用和使用。
一、什么是lsof命令?
lsof是一个简称,全称为"list open files",它是一个在Unix和类Unix 操作系统中用于查看当前系统打开文件的命令。
通过lsof命令,我们可以获取打开文件的详细信息,包括文件描述符、文件类型、文件大小、文件所属进程等。
二、fd mem类型的含义
在lsof命令的输出结果中,我们常常会看到一种称为fd mem的文件类型。
fd是"file descriptor"的缩写,表示文件描述符。
而mem是"memory"的缩写,表示内存。
因此,fd mem类型即表示这个文件是通过内存映射的方式打开的。
三、什么是内存映射?
内存映射是一种将可执行文件或数据文件映射到进程的虚拟地址空间的操作。
通过内存映射,进程可以直接在内存中访问文件的内容,而无需进行繁琐的文件读写操作。
四、为什么使用内存映射?
使用内存映射有许多优势。
首先,通过内存映射,我们可以实现文件的共享,多个进程可以同时访问同一个文件,而无需每个进程都打开一个文件副本。
其次,内存映射可以提高文件读写操作的效率,因为数据直接
存储在内存中,无需进行磁盘IO操作。
此外,内存映射还可以简化对文件的访问,通过将文件映射到虚拟地址空间,进程可以像访问内存一样访问文件。
五、fd mem类型的应用场景
fd mem类型常常用于访问大型文件或需要高效读写的文件。
例如,数据库系统常常使用内存映射技术将数据文件映射到内存中,以提高数据库的性能和响应速度。
此外,虚拟内存和动态链接库也是应用内存映射的例子。
六、如何使用lsof命令查看fd mem类型文件
使用lsof命令查看fd mem类型文件非常简单。
只需在终端输入以下命令即可:
lsof -n grep mem
其中,-n参数可以避免将网络活动转换为主机名,加快查询速度。
grep 命令用于过滤出包含"mem"关键词的结果。
七、fd mem类型文件的特征
fd mem类型文件具有一些特征,可以通过lsof的输出结果进行判断。
首先,这类文件的DEVICE字段通常是一个"mem"字符串,表示文件是通过内存映射打开的。
其次,显示的文件地址范围在"0x"开头,并且是一个长度较大的十六进制数,表示文件在内存中的地址范围。
八、安全性和风险
尽管内存映射提供了许多优势,但它也带来了一些安全性和风险问题。
由于文件内容直接映射到内存中,一旦进程被攻击者控制,他们可以直接
对文件进行修改,这可能导致严重的数据破坏或泄漏。
因此,对于使用内存映射的文件,需要加强对进程和访问权限的控制,以确保文件安全性。
九、总结本文详细介绍了lsof命令中的fd mem类型文件以及它们在计算机系统中的作用和使用。
通过内存映射技术,进程可以将文件映射到虚拟地址空间,从而实现高效的文件访问。
然而,虽然内存映射提供了许多优势,但也需要注意文件的安全性和访问权限。
通过运行lsof命令并按照本文所述的步骤查看fd mem类型文件,我们可以更好地理解和管理当前系统中打开的文件。