第六十四讲——boot loader之GRUB grub除了能够提供给我们一个系统选择的界面之外,还可以给我们提供一个编辑界面: e:进入编辑模式 a:修改内核参数 c:进入命令行模式 当我们处于引导界面的时候,定位好光标,按e键进入二级菜单,也就是title后面的三,我们想要编辑某一项时直接敲e键即可,进入编辑界面,添加字符(按空格) 添加1,装载内核启动的第一个程序时的启动级别(0-6) 1为单用户模式,s/S,single都可以进入单用户模式,完成后回车 d,删除一行。o,新增一行。使用同vim 如果不希望有人进入单用户模式(使用grub)。我们还可对grub进行加密,我们在grub.conf配置文件中的任何一个title上面加入一个人全局变量,使用password定义一个密码(明文)。当然,我们还可以以加密的方式进行添加密码。 passwd –md5 带杂质的密码 grub-md5-crypt可以生成一个带杂质的密码串。 我们将生成的密文加入/etc/grub.conf或者/boot/grub/grub.conf,也可以将password一行放到title中,这就意味着需要输入密码才能够启动操作系统或者内核,在引导界面按p输入密码。 在命令行下,我们查看当前的运行级别使用runlevel,显示的结果可能是两个数字,第一个数字表示的是上一个级别,N为没有切换过,第二个数字表示当前运行级别。 uname –r/-a 查看内核,平台架构等信息,uname也可以单独使用。 uname –r显示内核的版本号(releas号) uname –a 显示所有 grub修复 当grub损坏的时候,我们可以使用grub命令进入grub的访问接口进行修复。 #grub 为了实现在命令行下的grub修复,我们先将MBR中的前446byte破坏掉,也就是先将grub的第一阶段破坏掉。 #dd if=/dev/zero of=/dev/sda bs=446count=1 第一步,安装stage1 grub的第一阶段 grub>一定要指定内核所在分区(/boot) grub > root(hd0,0)第一块硬盘上的第一个分区,并指定root。 grub> setup(hd#) 安装grub,安装在哪一个硬盘,需判定是哪一个磁盘。 grub > quit 退出 第二步,安装grub #grub-install –root-directory=/(/boot目录的父目录) /dev/hd# 内核的所在分区一定要挂载到/boot目录,只要知道boot的父目录并挂载到某个目录,指定硬盘。会自动安装stage1.5的文件(文件系统格式),手动编辑grub.conf cd到相应目录,一般为/boot/grub/ #vim grub.conf default=0 引导指定的title,从0开始编号 timeout=5 界面超时时长 hiddenmenu 隐藏菜单 splashimage=(hd0,0)/grub/spash.xmp.gz图片文件可以省略不写 title 自定义系统或者内核的名称 root (hd0,0) kernel /vmlinuz initrd /initrd.img 当grub配置文件损坏的时候,只有第一步的boot loader加载,第二步因为无法读取stage2配置文件,所以会提供一个grub的命令行,我们只需要知道内核在哪儿,根在哪儿就能够启动起来。 当第一步的boot loader启动起来,加载不了stage2的时候,会出现一个grub的引导字符界面,在这个界面里,支持find命令,可以查找硬盘上是否存在内核。 grub > find (hd0,0)/ grub > root (hd0,0)指定root grub > kernel /vmliuz...可以使用TAB键补全 grub > initrd /initrd......,必须同内核版本保持一致,可以使用TAB键补全。 grub > boot 重启当前系统 给自己讲linux 2017-02-02 评论 1699 次浏览
第六十三讲——boot loader 这一讲来说一说操作系统中的引导程序boot loader,boot loader存在于MBR的前446个字节,从启动顺序来看,boot loader能够访问的一定是一个基本的磁盘设备,kernel一定能够访问。因此boot loader能够访问的分区,kernel也能够访问,所以kernel和initrd(或者initramfs)这两个文件一定是位于同一个分区上的,由boot loader同时一块儿加载进内存的,kernel借助initrd(initramfs)中的驱动、模块,最终实现根的访问。 然后加载/sbin/init,所有用户空间下的程序都是由init来完成初始化,在windows当中,系统启动起来之后会有许多的服务随之启动,且有所谓的安全模式,当设备驱动不兼容的时候,可以进入安全模式卸载相应的驱动程序。 VGA模式,当显卡分辨率太高而无法进入操作系统时,以最基本的驱动程序进入操作系统。 在linux操作系统下,不同服务的启动划分为运行级别,在不同的运行级别下启动相应的服务。 所谓的运行级别也就是在不同的级别下所启动的服务不一样,运行级别的核心就是启动的服务不同。 在linux操作系统中运行级别分为0-6,一共7个运行级别。 init 0:halt 关机 init 1:单用户模式,类似于Windows操作系统下的安全模式,直接以管理员的身份进入系统,可能不需要密码。 init 2:多用户模式,multi user mode 有网络功能,但是不启用nfs(网络文件系统)。 init 3:正常多用户模式,multi user mode 但是这种是纯文本的多用户模式(命令行)。 init 4:保留的运行级别 init 5:正常的多用户模式,图形界面,graphic mode init 6:reboot 重启 默认运行级别可以再/etc/inittab文件中进行修改。 讲了大半天的运行级别,我们还是回过头来讲一讲boot loader,详细的讲一讲启动的流程。 首先我们需要知道的是,boot loader也是一个程序,对于不同的操作系统其boot loader是不一样的,boot loader是由操作系统提供并安装在MBR中的前446个字节。 boot loader是位于MBR中的,且MBR不属于任何一个操作系统,是全硬盘级别。在Windows8以后,boot loader不能引导其他的操作系统,而且会将MBR锁死,美名其曰安全。 linux常用的boot loader有两种: LILO:linux loader,早期linux用于引导linux启动的一个boot loader,但是它不能够引导1024柱面分区以后的内核,因此它不支持大硬盘,在嵌入式领域应用很多。 GRUB:Grand Unified Bootloader(统一的引导程序),GRUB是两阶段的引导程序。 stage 1:GRUB的第一阶段是在MBR中,作用是用于引导第二阶段。 stage 2:第二阶段,位于内核所在分区的/boot/grub/stage2,也就是说MBR中的第一阶段需要刚问这个目录。 /boot是一个基本的磁盘分区,但是这个分区需要格式化并安装文件系统,这个文件系统的类型可能不一样。因此,在stage2之前还有一个步骤,称为stage1.5,用于识别常见的不同类型的文件系统,在/boot/grub下有很多的*1.5的文件,这些都是不同类型的文件系统,在加载对应的文件系统之后启动stage2,stage是一个很强大的程序,它完全突破了446byte的限制,第二阶段还能加载图片进行显示,但是需要借助一个配置文件grub.conf 在grub.conf配置文件中,可以定义开机界面操作系统选择时加载的背景图片,提供操作系统的选择,能引导哪些内核。 GRUB的使用: /etc/grub.conf为/boot/grub.conf文件的连接文件 在grub.conf配置文件中,顶格写都是全局的属性定义,下面的每一个title用于定义一个操作系统或者一个内核,linux操作系统可以提供不同版本的内核,我们启动不同内核的话,每一个内核都需要在title中声明,所以,title是用于定义当前硬盘上不同操作系统或者当前系统不同版本的内核。 grub.conf配置文件的内容需要手动写入,在配置文件出现错误的时候需要能够在grub中正确的指定。 default=0 默认启动的title(从上往下编号,从0开始),用于设定默认启动的内核或者系统的。 timeout=5 等待用户的超时时长,单位为秒。 splashimage=(hd0,0)/grub/splash.xpm.gz指定grub的背景图片。 hiddenmenu 隐藏菜单 title centOS。。。。。(可以随意更改,需要引导的操作系统或内核的标题) root (hd0,0)# 指定内核所在的设备 kernel /vmlinuz-2.6.32-431.el6.x86_64 roroot=/dev/mapper/volgroup-lv_root rd_NO_L....装在逻辑卷上的操作系统。 从ro开始为向内核传递参数,我们之前说过,在/proc目录下的每一个进程目录中都有一个cmdline为启动这个进程所执行的命令。在/proc目录下有一个cmdline文件(与内核有关),这个文件中的内容就是由grub传递给内核的。 initrd /initromfs-2.6.32...........img为虚根的文件系统,ramdisk文件的路径。 grub识别硬盘时,不论是什么接口的硬盘一律识别为hd,hd# 表示第N块磁盘,从0开始编号。hd#,#第二个井号表示硬盘的分区。格式为hd#,N,N为0.1.2.3(主分区) grub访问磁盘时,文件系统尚未存在,多以grub是直接访问硬盘的分区,所以这个分区被当做根。 .img是一个镜像文件,在展开后可以作为磁盘使用,这些文件被称为镜像文件,或者本地回环设别,initrd文件一定要与内核的版本号时刻保持一致。 xshell可以在windows下打开linux下的图形界面,结合xmanage,gimp类似于ps的工具。修改图片的宽为640.高为480,14位色,选择文件扩展名的类型的xpm格式,并保存,压缩后放入/boot/grub目录下,修改图片的地址和名称即可。 给自己讲linux 2017-02-01 评论 1639 次浏览
第六十二讲——linux内核 虽然linux内核源码很长,有上千万行,但是实际上我们使用到的功能是比较有限的,在编译内核的时候按照我们的需求进行编译,编译完成后内核的大小可能只有几十兆,在经过压缩,几兆大小也是可以实现的。 但是对于red hat、debian等发行版来说,为了使操作系统弄安装在各个平台上,且内核不臃肿,只能够将功能模块化,这些模块是被能被进程使用的,只有内核才能调用,所以这些外部的模块称你为ko(kernel object)内核对象,因此内核由核心和内核对象组成。内核是动态加载模块的,模块存放在/lib/modules目录下。 系统上可以有多个内核并存,且每个内核在/lib/modules目录下都有一个跟内核版本号完全相同的目录,即以内核版本号命名的目录,在这个目录下有对应内核所需要的各种外围模块,而模块同各应用程序一样,存在依赖关系。在内核的内部有一个模块依赖关系的文件,用来识别这种依赖关系。 在大多的系统上,内核的命名为vmlinuz /lib/modules下的*.dep文件是内核的模块依赖关系(自动生成) /lib/modules下的*.*map为映射表,或者叫符号链接表 /lib/modules/内核版本号/kernel 下为内核模块 arch 平台驱动(驱动CPU) crypto 加密解密相关 drives 驱动 fs 文件系统 kernel 内核自身的其他功能 lib 库 mm 内存管理 net 网络管理(TCP/IP协议栈,并不是网络驱动) sound 声卡 那么此时问题来了,我们的驱动都放在了/lib/modules下,而我们的内核在驱动根文件系统时是需要先驱动硬盘,而硬盘的驱动在根文件系统下,这样就进退两难了,难道我们还得将驱动程序放入内核中?那样一来我们费劲心思模块化减少内核体积的意义便荡然无存了。 于是我们只能妥协,寻找一个中间人来完成驱动硬盘的工作,这个中间人只能向内核提供硬盘的驱动程序,用以挂载根文件系统。 那么这个中间文件是否会臃肿? 这个我们就得从操作系统的安装说起,在操作系统安装的过程中,安装程序会知道内核要访问的“根”在哪个地方,也会知道设备的类型,所需要的驱动程序,于是在安装完成的最后一个步骤安装程序会通过脚本或者命令自动收集内核访问这个设备所需要的程序有哪些,并动态生成这个中间文件,而这个文件就是一个桥接,将内核与文件系统建立联系。 那么这个中间文件是如何被访问的?它不存放在硬盘中? 我们之前说过,内核要访问任何文件都必须通过文件系统来访问,这样的设计风格、访问接口、访问方法才能够一致。这也就意味着这个中间文件得是一个独立的文件系统,但是我们之前也说过,访问任何文件系统得先驱动硬盘,且得通过根文件系统进行访问,于是这个中间的文件系统就是一个根文件系统,我们称之为虚根,只是用于临时过渡,在一个操作系统中虽然两个根文件系统不能同时存在,但是根文件系统是可以切换的。 当虚根的任务完成以后就会自动切换到真正的根文件系统。 #chroot命令就能够完成根目录的切换,可以将一个临时的目录作为根来使用。使用的时候只需要在命令后跟上目录即可。 #chroot /path/to/somewhere 在临时目录下应当有/bin目录,且/bin下应有一个bash程序用于与计算机交互,这样就可以运行了?实际上不是的,从我们前面所学的bash环境的配置文件来看,至少是需要一些配置文件的,我们也说过,程序的运行是需要依赖库文件的,因此我们可以大胆猜测,在临时目录下仅有/bin/bash是不能够切换成功的,因为bash程序不能成功的运行。 事实上,单独的bash不能成功切换根,此时我们需要将bash程序所依赖的库文件cp到临时目录的/lib下,因为临时目录切换为根之后,整个的运行机制是一样的。 #ldd /bin/bash 显示bash程序共享库的依赖关系 #ldd /path/to/somewhere(可执行程序的路径),显示一个程序运行所依赖的库文件。 我们手动将ldd /bin/bash 显示出来的库文件cp到临时目录下的/lib下,再次使用chroot命令切换根,我们会发现切换是切换了,但是提示符什么的就不是我们登录操作系统的时候的提示符了,原因就是我们登录后是bash程序的配置文件生效,才有了命令提示符的格式,我们如果将对应的配置文件放到对应的目录下也可以实现。 由于我们chroot改变了根,于是将临时目录作为根,根下仅有bash程序,也就是说,之前所有的服务都会挂掉,而且只能使用bash的内建命令,所有的外部命令无法使用。 外部命令和内部命令使用的帮助命令是有区别的,内建命令使用—help查看,外部命令使用man命令查看。 通俗点说,我们进行根切换就是画地为牢,将活动限制在一定范围内,而虚根进行切换时,机制同上,但是使用的命令是完全不一样的,虚根的切换时完完全全的切换,在切换时将虚根上的所有文件都搬运到真正的根上。 /proc 内核映射 在rhel5上,借助nash提供的switch_root命令完成根切换,而switch_root就是运行在临时根文件系统上的命令,这个命令能够将临时根中的文件搬运到真实根目录中,并以真实的根目录作为根,虚根这个文件能载入内存,并能够将内存中的一段空间模拟成磁盘空间使用,通常被称为ramdish,在rhel6上叫ramfs,所以在rhel5上这个文件的名字叫initrd,在rhel6上叫initramfs。这个跟红帽操作系统本身没有关系,而是跟红帽采用的机制又关系。 所以,内核要访问根,一般来讲需要两个模块。 一是这个设备的驱动 二是这个设备上的文件系统 我们再来梳理一下系统的系统流程: POST-->BIOS(Boot seqence)-->MBR(boot loader,446byte)-->kernel-->initrd(initramfs)-->/sbin/init 给自己讲linux 2017-01-31 评论 1638 次浏览
第六十一讲——linux的详细启动流程 为了更深层次的理解,再次对linux启动流程进行了解。 当我们在按下开机键的时候,机器会进行自我检测,POST加电自检,自检的程序是出厂的时候就设置好了,在加电自检的时候会将固化在ROM中的程序(指令)映射到物理内存当中,此时CPU就能够读取到RAM中的指令,进行硬件自检的流程,各个硬件,包括CPU、散热风扇是否正常,如果自检通过,则会根据BIOS中定义的设备启动顺序(boot sequence),去找操作系统所在的位置,如果没有启动顺序,设备就会混乱,所以计算机是按照设定好的顺序自上而下的取寻找启动设备的MBR(硬盘的第一个为512字节的扇区,但是当存储设备的容量大于2T的时候,设备采用的是GPT格式),MBR中有一段占据446byte的引导程序(boot loader),boot loader主要用于通过MBR中的分区表查找活动分区,也就是说boot loader能够找到操作系统所在的分区,并加载分区上的操作系统的内核。 当BIOS中设定的启动顺序中的第一个设备不存在MBR的时候,会从第二个设备上寻找,但是当第一个设备上存在MBR但是MBR已损坏时,是不会继续到第二个设备上寻找MBR,这一点我们必须要搞清楚,也就是说,按照BIOS中设定的顺序,存在MBR扇区的设备即为被认定的启动设备。 boot loader接管硬件后BIOS会退出,装在选定的磁盘分区上的内核,我们需要知道的是,内核一般是压缩存放的,boot loader加载完内核到内存后完成解压缩,而后将控制权转交给内核,这个时候内核取代了硬件的整体控制权,此时boot loader 完成工作退出。 kernel在接管硬件的时候必须要能够识别CPU、内存,我们之前说过,驱动程序能够使硬件更好的工作,因此内核在接管硬件时必须要去尝试探测每一个硬件,看看这个硬件的特性是什么,能不能够被驱动,能不能正常工作。 内核能提供文件系统,所以以前常说文件系统时内核的功能。 实现进程的管理 实现内存的管理 实现网络的管理 提供安全功能 提供驱动程序 当内核全面接管硬件以后,会启动init进程(/sbin/init),init是一个可执行的二进制程序,我们需要注意的是,init是用户空间的一个主导程序。因此,所有在用户空间所启用的进程都是由init来管理的,当我们需要和硬件打交道的时候才会切换到内核空间。 POST—>BIOS(boot sequence)-->MBR(boot loader)-->init(/sbin/init) 根所在的分区叫rootfs(根文件系统) 在linux中,根是访问其他任何存储设备的入口,当根挂载完毕就要启动操作系统了。 /bin,/sbin是操作系统自身启动就要用到的,不能独立分区。 kernel启动完成后会自动挂载根文件系统,以实现自引用,我们必须要告诉内核,根在上面位置,我们可以向内核传递一个参数,告诉内核,根在哪一个设备上。这一切的前提是内核能够驱动分区,否则是不能够访问rootfs的,这也就意味着内核必须能够探测到硬件分区,并能够访问这个分区。 如果我们将驱动程序做进内核,内核的体积会变得相当庞大,启动内核时所消耗的资源也就会越多,因此,这些驱动很显然是不能直接做进内核中的,他们是内核的功能,但不应该全部都放进内核。 在linux上,内核是由独特的结构的,从内核的设计结构来说,有两种。 一是单内核:将文件系统、进程管理等做进内核,由一个内核来管理,也就是说,内核靠一个进程来完成所有的功能。 二是微内核:内核很小,只有一个核心,将各种外围的功能做成它的子系统,当需要用到这个功能的时候就调用子系统,将子系统装载进内核。 对于但内核来说,任何一个功能出现问题则会殃及池鱼,因为它们是一体的,但是它的逻辑是相对简单的。 对于微内核来说,模块损坏不会引起全局的动荡,但是微内核因为分为多个模块,因此多模块之间的协调是很复杂的。 在实际的运用上,微内核实现的难度对冲了它所具有的的优势,linux属于单内核,对线程的支持并不是特别的好,线程(LWP:轻量级进程) Windows、solaris属于微内核,从根本上来说,微内核的设计才是真正意义上支持多线程。 给自己讲linux 2017-01-30 评论 1639 次浏览
第六十讲——进程间通信 进程间通信(IPC:inter process communication) 进程间通信是linux操作系统中非常常用的一种机制,我们说过,进程与进程间是相互意识不到存在的,那么进程与进程之间的通信还要到交换机上跑一圈?当然不是的。 一是通过共享内存,一个进程写点数据,另一个进程去读。 二是通过信号(signal)向另一个进程发送一个简短的信号。 三是通过旗语(semaphore),一个进程向另一个进程打个手势之类的。 信号: 使用kill –l可以显示出所有的可用信号。 kill 主要功能是终止一个进程。 但是kill通常用来向一个进程发送信号。 较为重要的信号有: 数字1:SIGHUP,让一个进程不用重启就可以重读配置文件,并让新的配置文件信息生效。 数字2:SIGINI:(Ctrl+C)终止(中断)一个前台进程。 数字9:SIGKILL:杀死一个进程,直接结束进程。 数字15:SIGTERM:终止一个进程,释放资源后终止。 我们制定一个信号的方式可以为: 信号号码:kill -# 信号名称:kill –SIGHUP 信号名称简写:kill –HUP kill 进程号,默认发送的是15号信号。 kill all command(进程名) 只要是叫这个名的进程全部结束 pkill 杀死一个进程,用法同pgrep 我们在执行一个命令的时候,有时候不想直接结束当前程序,又希望能够执行其他程序执行。这时候我们就需要使用到一种机制,一种将当前程序放入后台藏起来,使用的时候又能够取回来的机制。 ctrl + z 将当前进程放入后台藏起来。 fg命令,可以将后台藏起来的命令调入前台。 我们将占据了(终端)命令提示符的进程称为前台进程。 启动后释放命令提示符,在后台默默完成,称为后台进程。 我们在执行命令的时候,在命令前面加一个&符号,就会在执行程序后释放掉命令提示符。 当我们把一个进程从前台送入后台时,默认送给一个stop信号,进程送到后台时为停止状态。 #bg (background):让后台的停止作业继续运行,在后台运行。 #jobs 查看所有的作业(一般是后台的所有作业) 每一个作业都有作业号,作业号不同于进程号,且作业号前有加号“+”。 “+”:表示为被默认操作的作业。 “-”: 表示命令将第二个默认操作的作业。 #bg jobID(作业号),作业号可以省略,默认为带+号的作业。 #fg (jobID)将后台的作业调回前台。 bg和fg是不能够操作进程的,所以可以省略(%)号。 使用kill %jobID 终止一个作业。不加%为终止一个进程。 #vmstat:系统状态查看命令 procs 与进程相关 r:运行队列长度 b:阻塞队列长度 memory 与内存相关 swapd:交换空间已使用大小 free:空闲内存 buff:缓冲 cache:缓存 swap 与交换内存相关,表示从物理内存到swap分区有多少页面换进换出。 si (swap in):从物理内存放到交换内存(多少个页面) so(swap on): 从交换内存调入物理内存(多少个页面) io 与I/O相关 bi (blocks in)有多少个硬盘块调入内存 bo (blocks on)有多少个块同步到硬盘 system 与系统相关 in 中断的个数 cs 上下文切换的次数(进程切换的次数),当指定vmstat的时间间隔时,表示为,这个时间内切换了多少次。 cpu 与CPU相关 us 用户空间占用cpu的百分比 sy 内核空间占用cpu 的百分比 id 空闲的百分比 wa 等待io完成的百分比 st 被偷走的时间,指那些切换进程所消耗掉的时间。 vmstat #(number)刷新间隔,单位为秒 vmstat # # (vmstat 1 5)每隔一秒刷新一次,刷新五次。 uptime命令与top命令的第一行一样。 我们通过查看/proc/meminfo文件,也可以实现查看内存的信息。 查看/proc/##PID/maps可以查看当前进程占用物理内存的地址。 给自己讲linux 2017-01-29 评论 1692 次浏览
第五十九讲——进程之间的关系 在linux系统上,所有的进程都是一个进程的子进程,这个进程是init。 由内核生成init进程,此外所有进程由init进程生成,进程也是由优先级关系的。 内核尽可能的将公平的按需资源分配给各个进程。 但是在这些进程当中,必然会有一些进程的优先级,或者要实现的功能紧急性是高于其他进程的,所以我们应当优先满足这类进程的资源需求。 linux中进程的优先级共分为140个(0-139) 进程优先级的数字越小,优先级越高。其中0-99是由内核调整的,100-139由用户控制。 一般来讲,优先级越高的进程就越先执行,当同级别的进程很多时,从众多同级别进程中挑选一个也是很耗费时间的。因此,在linux2.6内核中引入了一种独特的机制,无论同级别进程队列有多长,从中找到一个进程所消耗的时间是相同的。 在计算机的程序设计上,衡量一个和程序/算法,面对不同长度的队列它的性能如何有一个标准:O O(1):无论队列有多长,从中挑选一个的时间是一样的。 O(n):线性增长,队列越长消耗的时间越多。 O(log n): O(n^2) O(2^n) 代表的是,我们从队列中挑取一个数据所需时间随队列长度变化,曲线呈现出这种函数的形式。 一个进程的优先级高一般有两种特性: 一是获得更长的CPU运行时长。 二是更优先获得CPU运行的机会。 用户可调的优先级范围为100-139 每一个进程都有一个NICE值 nice:-20-19,分别对应nice中100-139 每一个进程的默认nice值为0. 普通用户只能够调大nice值,管理员不受限制。 我们可以按照用户的权限对进程的nice值进行调整 一 如果进程已经启动,使用renice更改程序的优先级nice值 renice # PID (-20 - 19) 二 我们还可以在程序启动时为进程指定nice值(启动时默认为0) nice -n # command(命令) (-20 - 19) 内核为了追踪进程,依靠进程ID,即PID,procec ID进程号 除了init进程,其它进程都有父进程。 /proc/目录下,以数字命名的目录,每一个目录对应一个进程,目录下保存了这个进程的所有相关属性信息。。每一个进程号都是唯一的,就算进程退出了,其它进程也不会占用该进程号。 在众多的进程当中,init的进程号永远为1. /proc是伪文件系统,关机状态下该目录下是没有任何文件的。 /proc/目录下以数字命名的目录对应的进程,目录下的文件是内核中参数的映射,让我们看起来是一个文件,都是与进程相关的属性。 #pstree 进程树查看,可以很清楚的分清楚子进程和父进程。 #ps:process state(进程状态),用于查看进程的相关信息的专用命令,这个命令有很多种使用风格: linux两大阵营:BSD、system V(罗马数字5) BSD风格,所有的选项都没有短横线。 system V风格:所有的选项都需要加短横线‘-’ #ps: -a 显示所有和终端有关的进程。 -u 显示进程是由哪个用户启动 -x 显示与终端无关的进程,用问号?表示与终端无关。 进程按照与终端相关与否分为两类: 跟终端相关的进程,通过命令启动的进程。 跟终端无关的进程,随内核启动的进程。 #ps ax PID(进程号) TTY(终端) STAT(进程状态) TIME(运行时长) COMMAND(命令) STAT(进程状态) D不可中断的睡眠 R运行或者就绪 S可中断的睡眠 T停止 Z僵死态 BSD风格 < 表示优先级高的进程 N 表示优先级低的进程 +前台进程组的进程(进程组:bash下的进程。前台,从命令行运行起来的。) l 多线程进程 s 会话进程首进程 ps aux |head(默认显示10行)BSD风格 USER(进程的有效用户,发起者) PID(进程号) %CPU(占用CPU时长同所运行时长的比值) %MEM(占用内存的百分比) VSZ(虚拟内存级) RSS(常驻内存级) TTY(关联终端) STAT(进程状态) START(启动时间) TIME(运行时长,真正占用CPU的时长) COMMAND(由哪个命令启动的进程,如果命令中加了中括号,表示这是一个内核进程) #ps –elF -A|-e显示所有进程 -l 长格式显示 -F 显示更多的更详细的内容 ps –el UID(用户ID) PID(进程号) PPID(子进程号) PRI(优先级) NI(nice值) SZ(size大小) -el通常和-F一块儿使用。 ps –elF RSS(常驻内存级) PSR(正运行在哪个CPU上) 常用的有ps –elF、ps –eF、ps –ef ps –o 可以指定显示的字段,怕是命令默认只显示前台进程。 #ps –axo pid,comm,ni 只显示ps –ax中PID、COMMAND、NI字段。 #pstree显示进程树 #pgrep,以grep的形式显示进程信息。 pgrep–U root bash以root身份运行的bash进程 -u euid -U UID 例如:user1执行了一个命令,而命令的属主是root,命令的发起者为user,是以root身份运行的,此时root就是euid,即有效ID #pidof 指定一个程序名找PID(进程号) ps显示的为命令执行那一刻的信息 我们还可以使用top命令动态查看,默认每5秒刷新一次,监控系统最好用的命令之一。 top命令下列表解释: 第一行:系统时间、运行时长、登录用户、平均负载(load avrage 过去一分钟,过去五分钟,过去十五分钟的平均队列长度,值越小,CPU负载越低) 第二行:TASKS(所有进程相关信息) ntotal(n个进程)1running,n-1 sleeping,0stopped,0zombie 第三行:CPU(s)CPU的负载情况,多核心CPU可能有多行 US(userspace,用户空间,用户进程所占用的百分比) SY(内核空间占用百分比) NI(调整nice值影响的比例值) ID(空闲百分比) WA(等待I/O 完成所占用的百分比) HI(硬件中断占用时间) SI(软件中断占用时间) ST(被偷走的时间) 内存空间 SWAP交换空间 top有许多的交互式的子命令: M根据驻留内存大小进行排序(默认为CPU使用百分比排序) P 根据CPU使用百分比排序 T 根据累计时间进行排序 l:是否显示平均负载和启动时间 t: 是否显示进程和CPU状态相关信息 m 是否显示内存相关信息 c:是否显示完整命令行信息 q:退出top命令 k:终止某个进程,通过进程号 给自己讲linux 2017-01-28 评论 1664 次浏览