|
进程管理 一些细节 进程一般分为交互进程、批处理进程和守护进程三类。 守护进程总是活跃,在系统启动时通过脚本自动启动,或由root启动,通常在后台运行。 一个进程可以拥有子进程。当父进程终止时,它的子进程也随之终止;而子进程终止时,父进程通常可以继续运行。 init 进程为根进程,所有进程都是它的子进程 ps 显示进程信息,参数可省略 - aux 以BSD风格显示进程 常用 -efH 以System V风格显示进程 -e , -A 显示所有进程 a 显示终端上所有用户的进程 x 显示无终端进程 u 显示详细信息 f 树状显示 w 完整显示信息 l 显示长列表 示例: ps alx 另一种常用输出格式 ps aux | less 将输出通过管道,使用 less 查看 ps aux | grep <关键字> 通过关键字查找进程 输出字段 USER 进程所有者 PID 进程ID PPID 父进程 %CPU CPU占用率 %MEM 内存占用率 NI 进程优先级。数值越大,占用CPU时间越少 VSZ 进程虚拟大小 RSS 页面文件占用 TTY 终端ID STAT 进程状态 D 不可中断 Uninterruptible sleep (usually IO) R 正在运行,或在队列中的进程 S 处于休眠状态 T 停止或被追踪 Z 僵尸进程 W 进入内存交换(从内核2.6开始无效) X 死掉的进程 < 高优先级 N 低优先级 L 有些页被锁进内存 s 包含子进程 + 位于后台的进程组; l 多线程,克隆线程 multi-threaded (using CLONE_THREAD, like NPTL pthreads do) pstree 树状显示进程信息 -a 显示完整命令及参数 -c 重复进程分别显示 -c 显示进程ID PID -n 按 PID 排列进程 pgrep <进程名> 显示进程的PID -l 显示进程名和进程PID -o 进程起始ID -n 进程终止ID xkill 在图形界面中点杀进程。执行此命令后,鼠标指针变为骷髅图案(一定看过《加勒比海盗》吧)。在窗口中点击左键杀死进程,右键取消 pkill <进程名> 结束进程族。如果结束单个进程,请用 kill kill [信号代码] <进程PID> 根据PID向进程发送信号,常用来结束进程,默认信号为 -9 -l [信号数字] 显示、翻译信号代码 -9 , -KILL 发送 kill 信号退出 -6 , -ABRT 发送 abort 信号退出 -15 , -TERM 发送 Termination 信号 -1 , -HUP 挂起 -2 , -INT 从键盘中断,相当于 Ctrl+c -3 , -QUIT 从键盘退出,相当于 Ctrl+d -4 , -ILL 非法指令 -11 , -SEGV 内存错误 -13 , -PIPE 破坏管道 -14 , -ALRM -STOP 停止进程,六合彩,但不结束 -CONT 继续运行已停止的进程 -9 -1 结束当前用户的所有进程 renice <优先级表达式> <进程表达式> 重新设定进程优先级(无此必要) 优先级表达式: +|-|= <nice值> nice取值范围: -20~19 进程表达式: -p <PID> 通过进程ID进行设定 -g <PGID> 通过进程群组ID -u <UID> 通过进程拥有者UID设定 top 动态、交互式进程管理器 -c 显示进程启动状态,包括参数、操作对象等;而不只是进程名 -d <秒> 刷新频率。 -d 5,表示5秒刷新一次 -n <次> 刷新次数,然后退出。 -n 5,表示刷新5次后退出; -b 以批量模式运行,让输出能够使用管道或重定向。但不能进行交互,最好和 -n <次> 参数一同使用 -i 禁止显示空闲进程或僵尸进程; -p PID 仅监视指定进程的ID;PID是一个数值; -s 安全模式运行,禁用一些效互指令; -S 累积模式,输出每his he licopter is dark www.5566001.com, and fly 进程的总的CPU时间,包括已死的子进程; 交互命令: <space> 立即刷新 k 交互式杀死进程,提示输入进程 PID (默认发送信号15) r 设定renice,提示输入PID和renice值 s 改变两次刷新时间间隔,以秒为单位 n 设定显示进程数, 0 为不作限制 i 隐藏空闲进程和僵尸进程 S 切换到累积时间模式 l 开关,在顶部显示 uptime 信息 t 开关,在顶部显示 进程和CPU状态 m 开关,在顶部显示 free 信息 c 显示方式切换: 进程名/进程启动状态 A 按进程启动顺序进行排序。由新到旧 M 按内存占用排序。由大到小 N 以进程ID排序。由大到小 P 按CPU占用排序。由大到小 T 按时间/累积时间排序 f ,F 设定显示字段。设定完成后空格退出 o,O 设定显示字段的排序。大写向前移动,小写向后移动,空格退出 h,? 显示有关安全模式和累积模式的帮助信息 W 把当前的配置写到~/.toprc中; nohup <命令> 将任务提交到后台,输出附加到 ~/nohup.out 文件。即便用户退出登录,提交的命令仍继续执行。 <命令> & 背景执行此命令,如果用户退出登录,则命令停止执行 <命令1> ; <命令2> ; ...... 命令队列,从左向右,依次执行以 ; 分隔的命令 <命令1> && <命令2> && ...... 命令队列,从左向右,依次执行以 && 分隔的命令。前一个命令执行成功,后一个命令才能执行 <命令> <Ctrl+z> <Ctrl+z> 挂起当前Shell中的任务 jobs 显示背景任务 bg [任务编号] 将挂起的任务背景执行 fg [任务编号] 将背景任务调到前台执行 计划任务 cron anacron 磁盘和内存管理 一些细节 Linux中,设备用/dev/目录下的文件表示。例如 /dev/hda1 第一块硬盘的第一主分区 /dev/hdb5 第二块硬盘的第一逻辑分区 /dev/sda4 第一块SATA硬盘的第四主分区,或者扩展分区 /dev/null 黑洞设备 关于磁盘设备,详见 分区概念 mount <设备文件> [挂载路径] 挂载文件系统 -t 指定文件系统的类型。通常不必指定,mount自动检测。下面是常用的格式 reiserfs ReiserFS 3.6版 jfs IBM技术 xfs SGI技术(适合高级服务器,桌面用户慎用) ext3 Linux传统文件系统 vfat fat fat32 ext2 不带日志的ext3 ntfs WINNT iso9660 光盘 smbfs Windows文件共享 -o [选项1] [选项2] ...... loop 环设备。光盘、ISO镜像等 ro | rw 只读readonly;可读写read-write sync | async 同步模式|异步模式。决定修改是否立即写入文件系统 atime | noattime 读取时是否修改访问时间。对于写入敏感设备,例如闪存、软盘,建议使用 *noatime* auto | noauto 自动挂载模式 exec | noexec 是否允许可执行权限 defaults 使用预设的选项 rw, suid, dev, exec, auto, nouser, async iocharset=UTF-8 指定字符集,可简写为 utf8 codepage=936 指定代码页,可简写为 cp936 西文系统代码页为 437 umask=<权限掩码> 设定权限掩码 uid=<UID> 设定归属用户 gid=<GID> 设定归属群组 remount 以不同选项重新挂载 -L <卷标> 将带有特殊卷标的分区 Tip 权限掩码 权限=777-权限掩码(三位) | 7777-权限掩码(四位) 假如权限掩码为 022 ,则新建对象权限为 755 rwxr-xr-x 可以使用 umask 命令设置权限掩码 mount -a 挂载 /etc/fstab 文件中定义的所有设备 示例: sudo mount -t iso9660 -o loop /dev/cdrom0 /media/cdrom sudo mount -t vfat -o remount iocharset=utf8,codepage=cp936 /dev/hda5 /media/hda5 umount <设备文件> | <挂载路径> 卸载已挂载文件系统 df 查看已挂载文件系统的磁盘空间占用 -a 显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统 -T 显示文件系统类型 -k 以k字节为单位显示 -i 显示i节点信息,而不是磁盘块 -t <文件系统类型> 显示指定类型的文件系统的磁盘空间使用情况 -x <文件系统类型> 列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。 -l 只显示本地文件系统 free 查看内存、缓冲区、交换空间的占用 -b 以字节为单位显示数值 -k 以千字节为单位显示数值 -m 以兆字节为单位显示数值 -g 以吉字节为单位显示数值 -l 显示内存占用峰值 -o 不显示缓冲区占用 -t 统计结果 -s <秒> 刷新频率 sync 同步文件系统。将缓冲区中的数据写入文件系统 fdisk <磁盘设备文件> 分区表修改工具 交互命令: m 使用帮助 l 查看已知文件系统类型 p 显示分区信息 n 新建分区 (p:主分区 l:扩展分区 参见 分区概念 ) d 删除分区 t 改变分区类型 w 将改动写入分区表 q 放弃改动并退出 * 磁盘设备名称为整块磁盘,而不是磁盘中的分区。例如 /dev/hda ,而不是 /dev/hda1 fdisk -l 查看所有磁盘分区信息 cfdisk 更加友善的分区表修改工具 mkfs.<文件系统类型> <分区设备文件> 将分区格式化为文件系统。 文件系统类型 示例: sudo mkfs.reiserfs /dev/hda1 mkfs <分区设备文件> -t <文件系统类型> 指定文件系统类型 -c 格式化前检查磁盘 mkisofs -o <镜像文件> [源文件目录] 用光盘或者文件制作iso镜像 -b 可启动镜像 hdparm <磁盘设备文件> 设置硬盘参数 -d <0|1> DMA模式开关 -a <0|1> 预计模式开关 -t 性能测试 -T 缓存性能测试 -c <0|1|3> 32位传输模式开关 -g 显示柱面,扇区等信息 -i -I 显示磁盘信息 网络和硬件管理 ifconfig 配置网络接口 -a 显示所有网络接口 ifconfig <网卡> up|down 激活|禁用网卡 示例: :: sudo ifconfig eth0 up ifconfig <网卡> add <IP地址> [ netmask <子网掩码> ] 给网卡指定IP地址或子网掩码 route 配置路由及网关 route add -net <路由地址> gw <网关地址> [ netmask <子网掩码> ] dev <网卡> 指定路由及网关 route del -net <,(全讯网地址www.7788001.com)网关地址> gw <网关地址> [ netmask <子网掩码> ] 删除路由及网关 ip 配置网络 子命令: link 网卡配置 address 配置地址。相当于 ifconfig route 配置路由。相当于 route 参数: show 显示 (默认) set 设置 add 添加 del 删除 示例: ip link show 显示网卡配置 ip link set eth0 name xxx 重命名网络接口 ping <IP地址> 向目标地址发送ICMP封包,常用来测试网络 -b <广播地址> ping整个网段 -c 发送封包次数 -s <封包大小> 默认为64字节 netstat 网络连接状态 -r 显示路由表,同 route -a 所有连接 -t 只显示TCP协议 -U 只显示UDP协议 -l 只显示正在监听的端口 -p 显示PID和进程名 -c <秒> 刷新频率 * http/ftp/ssh…… 为应用层协议 * TCP/UDP为传输层协议 * IP/ICMP为网络层协议 lspci 查看PCI总线连接的设备 lsusb 查看USB接口连接的设备 lsmod 查看已加载模块 * /lib/modules/uname -r 目录下为所有可用模块 modprobe <模块名称> 启用模块
sof简介 lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接 和硬件。所以如传输控制协议 (tcp) 和用户数据报协议 (udp) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因 为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。 lsof使用 lsof输出信息含义 在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。 command pid user fd type device size node name init 1 root cwd dir 3,皇冠走地,3 1024 2 / init 1 root rtd dir 3,3 1024 2 / init 1 root txt reg 3,3 38432 1763452 /sbin/init init 1 root mem reg 3,3 106114 1091620 /lib/libdl-2.6.so init 1 root mem reg 3,3 7560696 1091614 /lib/libc-2.6.so init 1 root mem reg 3,3 79460 1091669 /lib/libselinux.so.1 init 1 root mem reg 3,3 223280 1091668 /lib/libsepol.so.1 init 1 root mem reg 3,3 564136 1091607 /lib/ld-2.6.so init 1 root 10u fifo 0,15 1309 /dev/initctl 每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。lsof输出各列信息的意义如下: command:进程的名称 pid:进程标识符 user:进程所有者 fd:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 type:文件类型,如dir、reg等 device:指定磁盘的名称 size:文件的大小 node:索引节点(文件在磁盘上的标识) name:打开文件的确切名称 其中fd 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改。 txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。其次数值表示应用 程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该 文件被打开并处于读取/写入模式,而不是只读 ® 或只写 (w) 模式。同时还有大写 的w 表示该应用程序具有对整个文件的写 锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2, 分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 fd 都是从 3 开始。 与 fd 列相比,type 列则比较直观。文件和目录分别称为 reg 和 dir。而chr 和 blk,分别表示字符和块设备; 或者 unix、fifo 和 ipv4,分别表示 unix 域套接字、先进先出 (fifo) 队列和网际协议 (ip) 套接字。 lsof常用参数 lsof 常见的用法是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。 例如,linux限制了进程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某 个上限)。如果你怀疑应用程序耗尽了文件描述符,那么可以使用 lsof 统计打开的文件数目,以进行验证。lsof语法格式是: 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 ipv6 protocol --> tcp or udp hostname --> internet host name hostaddr --> ipv4地址 service --> /etc/service中的 service name (可以不只一个) port --> 端口号 (可以不只一个) 例如: 查看22端口现在运行的情况 # lsof -i :22 command pid user fd type device size node name sshd 1409 root 3u ipv6 5678 tcp *:ssh (listen) 查看所属root用户进程所打开的文件类型为txt的文件: # lsof -a -u root -d txt command pid user fd type device size node name init 1 root txt reg 3,3 38432 1763452 /sbin/init mingetty 1632 root txt reg 3,3 14366 1763337 /sbin/mingetty mingetty 1633 root txt reg 3,3 14366 1763337 /sbin/mingetty mingetty 1634 root txt reg 3,3 14366 1763337 /sbin/mingetty mingetty 1635 root txt reg 3,3 14366 1763337 /sbin/mingetty mingetty 1636 root txt reg 3,3 14366 1763337 /sbin/mingetty mingetty 1637 root txt reg 3,3 14366 1763337 /sbin/mingetty kdm 1638 root txt reg 3,3 132548 1428194 /usr/bin/kdm x 1670 root txt reg 3,3 1716396 1428336 /usr/bin/xorg kdm 1671 root txt reg 3,3 132548 1428194 /usr/bin/kdm startkde 2427 root txt reg 3,3 645408 1544195 /bin/bash ... ... lsof使用实例
一、查找谁在使用文件系统 在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下: # lsof /gtes11/ command pid user fd type device size node name bash 4208 root cwd dir 3,1 4096 2 /gtes11/ vim 4230 root cwd dir 3,1 4096 2 /gtes11/ 在 这个示例中,用户root正在其/gtes11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/gtes11,另一个则显示的是vim正在编辑/gtes11下的文件。要成功地卸载/gtes11,应该 在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的 目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。
二、恢复删除的文件 当linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。 当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。 在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这 些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 pid 命名的目录中,即 /proc/1234 中包含的是 pid 为 1234 的进程的信息。每个进程目录中存在着各种文件,云鼎开户,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信 息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。 当 系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下: 首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下: # lsof |grep /var/log/messages syslogd 1283 root 2w reg 3,3 5381017 1773647 /var/log/messages (deleted) 从 上面的信息可以看到 pid 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下: # head -n 10 /proc/1283/fd/2 aug 4 13:50:15 holmes86 syslogd 1.4.1: restart. aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started. aug 4 13:50:15 holmes86 kernel: linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 smp wed jul 18 11:18:32 edt 2007 aug 4 13:50:15 holmes86 kernel: bios-provided physical ram map: aug 4 13:50:15 holmes86 kernel: bios-e820: 0000000000000000 - 000000000009f000 (usable) aug 4 13:50:15 holmes86 kernel: bios-e820: 000000000009f000 - 00000000000a0000 (reserved) aug 4 13:50:15 holmes86 kernel: bios-e820: 0000000000100000 - 000000001f7d3800 (usable) aug 4 13:50:15 holmes86 kernel: bios-e820: 000000001f7d3800 - 0000000020000000 (reserved) aug 4 13:50:15 holmes86 kernel: bios-e820: 00000000e0000000 - 00000000f0007000 (reserved) aug 4 13:50:15 holmes86 kernel: bios-e820: 00000000f0008000 - 00000000f000c000 (reserved) 从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 i/o 重定向将其复制到文件中,如: cat /proc/1283/fd/2 > /var/log/messages 对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。
(责任编辑:admin) |