Linux进程和vim
- 进程
- 进程概述
- 如何查看进程
- 进程管理
- 系统资源监控
- 任务管理
- vim
- vim命令介绍
- 用途
- 三种模式
- vim的操作
一 、 进程
a、进程概述
- 什么是进程?
- 是程序的具体实现,执行程序的具体过程。
- 操作系统与进程对比window系统进程
- 操作系统的一个重要功能就是为进程提供方便,比如启动进程、为进程分配内存空间、管理进程的相关信息等等。
如何产生进程?
- 执行或启动一个程序就可以启动一个进程 。
- 进程启动时 , 操作系统会为其自耦东分配一个系统内唯一的进程ID(PID)
示例
Linux启动的第一个进程 [root@localhost ~]# pidof init 1 进程演示 [root@localhost ~]# ps a vim install.log 图像界面新开一个Terminal#vim install.log
- 程序被加载为进程示意图
b、 如何查看进程
进程查看命令
ps(process status) :将某个时间点的程序运作情况截取下来 选项和参数 a :(all)(和输入终端(terminal) 关联的所有 process,通常与x一起使用,列出完整信息。 x :后台进程,通常与 a 这个参数一起使用,可列出较完整信息 u :有效使用者 (effective user) 相关的 process
常用的进程查看命令
- ps -aux 观察系统在当前时间所有的程序数据
- ps -axjf 使用类似树状的形式展示当前时间下系统的所有程序数据
- 参数不用背 , 推荐使用时查阅linux命令大全
示例
[root@root ~]# ps -aux | head -4 #查看当前时间下系统的前4条程序数据 Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.3 0.1 19364 1532 ? Ss 18:21 0:03 /sbin/init root 2 0.0 0.0 0 0 ? S 18:21 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 18:21 0:00 [migration/0]
以下为各选项的含义:
USER:该 process 属于那个使用者 PID :该 process 的程序标识符。 %CPU:该 process 使用掉的 CPU 资源百分比; %MEM:该 process 所占用的物理内存百分比; VSZ :该 process 使用掉的虚拟内存量 (Kbytes) RSS :该 process 占用的物理的内存量 (Kbytes) TTY :该 process 是在哪个终端机上面运作,若与终端机无关则显示 ?, 另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。 (pts表示虚拟终端,例如pts/1 pts/2 等) STAT:该进程目前的状态,状态显示与ps -l 的 S 旗标相同 (R/S/D/T/Z) START:该 process 被触发启动的时间; TIME :该 process 实际使用 CPU 运作的时间。 COMMAND:该程序的实际命令
Linux进程状态
D 不可中断 Uninterruptible(usually IO) R 正在运行,或在队列中的进程 S 处于休眠状态 T 停止或被追踪 Z 僵尸进程 W 进入内存交换(从内核2.6开始无效) X 死掉的进程 < 高优先级 N 低优先级 s 包含子进程 + 位于后台的进程组
僵尸进程
- 通常造成僵尸进程的原因是该进程应该已经执行完毕,或者是因故障应该要终止, 但该进程的父进程却无法完整、有效的将进程结束掉,而造成进程一直存在内存当中 。
top动态观察进程的变化
- ps是截取某一时间点的状态 , 而top是持续观察进程在一段时间内的状态
选项与参数
-d :后面可以接秒数,就是整个程序画面更新的秒数。默认5秒; -b :以批次的方式执行 top ,还有更多的参数可以使用,通常会搭配数据流 重导向来将批次的结果输出成为档案; -n:(Number)与 -b 搭配,意义是需要进行几次 top 的输出结果; -p :指定某些个 PID 来进行观察监测而已;
使用数据流的方式记录一段时间内程序数据的变化
top -b -n 5 > a.log //将一段时间内的进程变换状态写出到a.log文件中 , 后续可以使用vim或者cat a.log查看
在top执行过程中可以使用的按键命令:
? :显示在 top 当中可以输入的按键指令 P :以CPU的使用资源排序显示 M :以Memory的使用资源排序显示 N :以PID来排序 T :由该Process使用的CPU时间累积 (TIME+) 排序 k :给予某个PID后kill该进程(内核2.6后失效) q :离开top软件的按键 。
示例 top -d 1
[root@root ~]# top -d 1 top - 19:56:00 up 1:34, 4 users, load average: 0.01, 0.01, 0.00 Tasks: 83 total, 1 running, 82 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 1.0%sy, 0.0%ni, 99.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 1004412k total, 165588k used, 838824k free, 9828k buffers Swap: 2097144k total, 0k used, 2097144k free, 47180k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1474 root 20 0 98.0m 4052 3068 S 1.0 0.4 0:01.91 sshd 1497 root 20 0 15028 1212 960 R 1.0 0.1 0:01.11 top 1 root 20 0 19364 1532 1228 S 0.0 0.2 0:03.44 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.17 ksoftirqd/0 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 6 root RT 0 0 0 0 S 0.0 0.0 0:11.03 watchdog/0 7 root 20 0 0 0 0 S 0.0 0.0 0:12.11 events/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns 11 root 20 0 0 0 0 S 0.0 0.0 0:00.00 async/mgr 12 root 20 0 0 0 0 S 0.0 0.0 0:00.00 pm 13 root 20 0 0 0 0 S 0.0 0.0 0:00.08 sync_supers 14 root 20 0 0 0 0 S 0.0 0.0 0:00.11 bdi-default 15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kintegrityd/0 16 root 20 0 0 0 0 S 0.0 0.0 0:00.33 kblockd/0 17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpid 18 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_notify 19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kacpi_hotplug 20 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ata_aux 21 root 20 0 0 0 0 S 0.0 0.0 0:00.01 ata_sff/0 22 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksuspend_usbd 23 root 20 0 0 0 0 S 0.0 0.0 0:00.02 khubd 24 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kseriod 25 root 20 0 0 0 0 S 0.0 0.0 0:00.00 md/0 26 root 20 0 0 0 0 S 0.0 0.0 0:00.00 md_misc/0 第一行显示的信息:目前的时间,开机到目前为止所经过的时间 up 13min,已经登入系统的用户人数 1 user,系统在 1, 5, 15 分钟的平均工作负载 显示的是目前进程的总量与个别进程在什么状态(running, sleeping, stopped, zombie) 第三行显示CPU的整体负载 第四行和第五行表示目前的物理内存与虚拟内存使用情况 每个 process使用的资源情况; PID :每个process的ID; USER:该process所属的使用者; PR :Priority 的简写,程序的优先执行顺序,越小越早被执行; NI :Nice 的简写,与 Priority(优先级) 有关,也是越小越早被执行; %CPU:CPU 的使用率%MEM:内存的使用率; TIME+:CPU 使用时间的累加; COMMAND 进程名称 top默认使用CPU使用率(%CPU)作为排序的重点,如果想 要使用内存使用率排序,则可以按下M, 若要恢复则按下P 即可。 将top信息进行3次并输出到文件中 [root@root ~]# top -b -n 3 > /tmp/top.txt 。 查看top.txt文件[root@root tmp]# cat top.txt
pstree查看进程树
选项与参数
-A :各程序树之间的连接以 ASCII 字符来连接; -U :各程序树之间的连接以万国码的字符来连接。在某些终端接口下 可能会有乱码; -p :并同时列出每个 process 的 PID; -u :并同时列出每个 process 的所属账号名称。
c、进程管理
kill发送信号(并不只是杀死进程)
选项与参数
-l :这个是 L 的小写,列出目前 kill 能够使用的信号 (signal) 有哪些? signal :向进程发送的信号,指示其进行不同操作。用 man 7 signal 可知: -15:以正常的程序方式终止一个进程!!!; -9 :立刻强制终止一个进程!!!(!!不能强制结束系统级别的进程) -2 :代表由键盘输入 [ctrl]-c 同样的动作; -1 :对于sshd这样的守护进程,重新读取一次参数的配置文件 (类似 reload),如果进程为非守护进程,默认为终止进程; !!
示例
杀死sshd进程
查看进程ID
[root@root ~]# ps -aux | grep sshd Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ root 1137 0.0 0.1 66604 1188 ? Ss 18:22 0:00 /usr/sbin/sshd root 1394 0.0 0.4 100352 4036 ? Ss 18:35 0:00 sshd: root@pts/0 root 1449 0.0 0.4 100352 4040 ? Ss 19:32 0:01 sshd: root@pts/1 root 1474 0.2 0.4 100352 4052 ? Ss 19:53 0:01 sshd: root@pts/2 root 1515 0.0 0.0 103256 836 pts/2 S+ 20:09 0:00 grep sshd
通过kill杀死某一进程
[root@root ~]# kill 1474 Connection closed by foreign host.
通过killall杀死某一程序的全部进程
[root@root ~]# killall -9 sshd
d、 系统资源监控
系统资源监控命令
free :观察内存(memory)使用情况 uname:查阅系统与核心相关信息 uptime:观察系统启动时间与工作负载 netstat :网络监控 vmstat :侦测系统资源变化, CPU/内存/磁盘输入输出状态
free : 观察内存使用情况
选项与参数
-b :直接输入 free 时,显示的单位是 bytes,我们可以使用 b(bytes), m(Mbytes),k(Kbytes), 及 g(Gbytes) 来定义显示单位 -t :在输出的最终结果时,显示物理内存与 swap 的总量。
示例
[root@root ~]# free total used free shared buffers cached Mem: 1004412 159540 844872 0 8704 46360 -/+ buffers/cache: 104476 899936 Swap: 2097144 0 2097144 Mem一行显示的是物理内存的量 Swap,虚拟内存的量 total是总量,used是已被使用的量,free则是剩余可用的量 shared,共享内存 buffers,将写磁盘的内容 cached,已写磁盘或者已从磁盘读出的内容 。
uname : 查阅系统与核心相关
选项与参数
-a :所有系统相关的信息,包括以下的数据都会被列出来; -s :系统内核名称 -r :内核版本 -m :本系统的硬件名称,例如 i686或x86_64 等; -p :CPU 的类型,与 -m 类似,是显示的是CPU的类型; -i :硬件的平台(ix86); 。
- uptime :显示目前系统当前时间、已经开机多长的时间,用户数、以及 1, 5, 15 分钟的平均负载。
netstat: 网络监控
选项与参数:
-a :将目前系统上所有的已经连接、监听、Socket数据都列出来 -t :列出tcp网络包的信息 -u :列出udp网络包的信息 -n :以端口(port number)方式来显示(不以程序的服务名称) -l :列出目前正在监听(listen)的服务; -p :列出该网络服务的进程id(PID)
命令选项显示解析
netstat命令选项显示解析 Proto :网络的封包协议,主要分为TCP与UDP封包; Recv-Q:接收消息缓存区,远端进程发送而来,尚未被当前进程处理 的信息数,单位:字节; Send-Q:发送消息缓存区,向远端进程发送,尚未被其接收的消息数 ,单位:字节; Local Address ; Foreign Address:与当前进:本端网络地址(IP:port)程进行行通信的远程进程的网络地址( IP:port)(远程通信主机); State :网络连接状态,主要有建立(ESTABLISED)及监听(LISTEN); PID/Program name:显示 此服务的PID号码以及程序的命令名称 目前系统上已在监听的网络链接以及PID
补充: 防火墙的启动 、 关闭 、 状态查看
service iptables start 开启防火墙 service iptables restart 重启防火墙 service iptables stop 关闭防火墙 service iptables status 查看防火墙状态 但是以上都是暂时性的改变防火墙状态 , 重启服务器之后会恢复原有状态 chkconfig iptables off 永久关闭防火墙 chkconfig iptables on 永久开启防火墙
vmstat : 侦测系统资源的变化 , 动态的了解系统资源的运作 , CPU、内存 、 磁盘的输入输出状态
选项与参数:
-a :使用 inactive/active(活跃与否) 取代 buffer/cache 的内存输出信息; -f :开机到目前为止,系统复制 (fork) 的进程数; -s :将一些事件 (开机至目前为止) 导致的内存变化情况列表说明; -S :后面可以接单位,让显示的数据有单位。例如 K/M 取代 bytes 的容量 ; -d :列出磁盘的读写总量统计表 -p :后面列出磁盘分区,可显示该磁盘分区的读写总量统计
示例
统计目前主机cpu状态 , 每秒1次 , 共计4次
[root@root ~]# vmstat 1 4 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 844516 8892 46436 0 0 47 2 51 28 1 3 95 1 0 0 0 0 844468 8892 46436 0 0 0 0 17 14 0 2 98 0 0 0 0 0 844468 8892 46436 0 0 0 0 19 12 0 0 100 0 0 0 0 0 844468 8892 46436 0 0 0 0 19 14 0 1 99 0 0
显示解析
procs(进程字段 ) r :等待运行的进程数量; b:不可被唤醒的进程数量 这两个项目越多,代表系统越忙碌 (因为系统太忙,所以很多进程就无法被执行或一直在等待而无法被唤醒) memory (内存字段) swpd:虚拟内存被使用的容量; free:未被使用的内存容量; buff/cache:用于缓冲的内存; swap(交换分区字段) (重点记忆下si和so) si:每秒从交换分区写到内存的数据量大小,由磁盘->内存; so:每秒写入交换分区的内存数据量大小,由内存->磁盘。 如果si/so的数值太大,表示内存内的数据常常得在磁盘与主存储器之间传来传去,系统效能会很差 io(磁盘读写字段) bi:从块设备读入数据的总量(读磁盘)(每秒kb); bo:块设备写入数据的总量(写磁盘)(每秒kb) 。 如果这部份的值越高,代表系统的I/O非常忙碌 system(系统字段 ) in:每秒被中断的进程次数; cs:每秒钟进行的事件切换次数。 这两个数值越大,代表系统与接口设备的通信非常频繁 CPU (cpu字段) us:(user)非内核态的(用户进程) CPU 使用情况; sy:(system)内核态所使用(系统进程)的 CPU 情况; id: (idle )闲置的CPU情况; wa: (wait)等待I/O所耗费的CPU; st:被虚拟机(virtual machine)所盗用的CPU(2.6.11 以后才支持)
e、 任务管理
- 登录bash之后,就会取得一个名为bash的进程(它有自己的PID)了。在这个环境中所执行的其他指令,几乎都是所谓的子进程。
- 思考: 在Windows中我们经常会执行多个任务,例如打开qq和音乐。那么在经过几天的学习后,我们发现Linux的命令行窗口只能做一个任务,比如我们用vim编辑1.txt的时候无法去编辑2.txt (假设说存在)。但我们又需要执行这么一个操作的时候怎么办?Linux能不能让某一个程序在执行的时候在后台运行呢?
- 任务管理概念 :
- 前台
- 可以控制与执行的bash环境称为前台进程
- 后台
- 在操作系统中自动运行 , 无法使用ctrl+c终止 , 可使用bg 、fg命令操作的任务 , 可以通过jobs命令查看后台执行的任务
- 在一般情况下 , 可以通过ctrl+z将当前进程放置后台执行
- 前台
在当前bash执行多个任务
如: 我们需要复制一个很大的文件 , 和对另一个文件执行编译操作 时 , 可以让某一任务在后台执行
比如:cp file1 file2 & 重点在以上的这个“&”符号,他表示将file1这个文件复制为file2,同时将这个拷贝进程放到后台执行。 也就是说执行这一个命令之后,在这一个终端仍然可以做其他的工作。拷贝任务执行完成后,系统将会在终端显示完成的消息。
- ctrl+z 与&的区别
- ctrl+z 将当前的程序放置后台 , 状态为暂停
- 在执行的命令后加& 使该任务在后台运行 , 状态为运行状态
示例
[root@root ~]# vim anaconda-ks.cfg #ctrl+z [1]+ Stopped vim anaconda-ks.cfg 说明: 在vim的一般模式下,按下[ctrl]+z,屏幕上会出现[1],表示这是第一个任务 +代表最近一个被放到后台的任务,且目前在后台预期会被取用的任务( 调用切换到前台命令时会第一个被调用到) Stopped使用[ctrl]+z放到后台的任务都是暂停状态
jobs命令观察后台任务
选项与参数
-l :除了列出 job number 与指令串之外,同时列出 PID 的号码; -r :仅列出正在后台 run 的任务; -s :仅列出正在后台暂停 (stop) 的任务。 演示: [root@root ~]# jobs #显示全部后台进程(不含PID) [root@root ~]# jobs –l#显示全部后台进程(含PID) [root@root ~]# jobs –r [root@root ~]# jobs -s
fg命令将后台暂停的任务提取到前台执行
fg %jobnumber job number为任务号码(数字);%可有可无 fg 1 将任务号为1的进程调到前台执行。 +作用“表示当前的”,如果命令fg后面没有跟任务号,默认将带+的进程调到前台执行。-表示+号对应的进程被调前台后,“-”对应的进程立即变为“+”
bg命令让任务在后台中变为执行状态
bg 2 使后台中编号为2的程序变为执行状态
使用kill命令可以终止后台程序
[root@root ~]#jobs -l [2]- 3716 Stopped (tty output) vim install.log [3]+ 3775 Stopped vim anaconda-ks.cfg [4] 3790 Running tail -f test & [root@root ~]#kill -9 3775 #kill vim进程需要 -9 [root@root ~]# jobs -l [2]- 3716 Stopped (tty output) vim install.log [3]+ 3775 Killed vim anaconda-ks.cfg [4] 3790 Running tail -f test & [root@root ~]#kill 3716 #缺省为 -15,发现vim进程kill不掉,需要强制执行。 [root@root ~]#kill 3790 #普通进程是可以kill 掉的
脱机及注销后任务执行
nohup 可以让你在脱机或注销后(比如exit退出当前shell),还能 够让工作继续进行 nohup [命令与参数] 在当前终端前台执行 nohup [命令与参数] & 在后台执行 [root@root ~]# nohup tail -F test & [1] 3877 [root@root ~]# exit [root@root ~]# ps ax |grep tail 3877 ? S 0:00 tail -f test
二、 vim
a、 vim命令
vim 介绍
vim是一个类似vi的文本编辑器,不过在vi的基础上增加了很多新特性,vim被公认为类vi编辑器中最好用的一个。 vim是vi发展出来的一个文本编辑器。编译及错误跳转等方便编程的功能丰富,在实际工作中被广泛使用。 和Emacs并列称为类Unix系统用户最喜爱的编辑器。
vim作用
所有的Linux系统都会内建vi文本编辑器,其他的文本编辑器则不一定存在。 很多软件的编辑接口都会主动调用vi,例如visudo、crontab等 vim可视为vi的高级版本。 vim具有程序编辑的能力,可以主动的以字体颜色辨别语法的正确性,方便程序开发。
vim的三种模式
一般模式 以vim打开一个文件就直接进入一般模式(默认模式) 可以使用上下左右移动光标来移动,也可以使用删除字符或删除整行来处理文件内容,也可以使用复制、粘贴来处理文件数据。但无法任意编辑文件内容。比如说:我想写一个123。 编辑模式 在一般模式中可以删除、复制、粘贴等,按下i、I、o、O、a、A、r(快速替换)、R等任何一个字母后进入编辑模式。并在左下方出现INSERT或REPLACE。 该模式下可以输入文件内容。 按下<Esc>返回一般模式。 命令模式 在一般模式当中,输入:/?三个字符中的任何一个按钮,就可以将光标移动到最下面那一行。 在这个模式当中,可以提供查询、替换等功能。同时存盘(保存)、离开vi、显示行号等等命令都是在此模式进行。
一般模式快捷键
h或 光标左移一个字符。如果是20h,表示左移20个字符。 j或 光标下移一个字符 同上 k或 光标上移一个字符 同上 l或 光标右移一个字符 同上 [Ctrl]+[f]屏幕向下移动一页 Page Down!! [Ctrl]+[b]屏幕向上移动一页 Page Up !! 0或[Home]移动到此行最前面字符处!! $或[End]移到光标所在行的行尾!! H 光标移到当前屏幕最上方行的第一个字符!! M光标移到当前屏幕中间行的第一个字符!! L光标移动到当前屏幕最下方行第一个字符!! G移到此文件最后一行!!! nG移到第n行 gg相当于1G,即移到第一行!!! n[Enter]光标下移n行 /word向下查找单词“word”(!!!) ?word向上查找单词“word”(!!!) n表示重复前一个查找操作 N与n相反(反向查找) 替换 :s/word1/word2/g 在当前行将word1替换成word2(!!) :%s/word1/word2/g 在当前文件将word1替换成word2(!!) :n1,n2s/word1/word2/g在n1到n2行查找word1替换成word2 (n1、n2为数字) :1,$ s/word1/word2/g从第一行到最后一行查找word1替换成word2 :%s/word1/word2/gc同上,在替换前确认是否替换。(!!!)只能单行确认,需要逐步确认。 删除 x向后删除一个字符 nx向后删除n个字符(n为数字) X向前删除一个字符 dd删除光标所在行(!!!) ndd删除光标所在行以下n行(n为数字,包含当前行在内) d1G删除光标所在行到第一行所有数据(包括所在的行) dG删除光标所在行到最后一行(!!) d$或d end删除光标所在处到同行最后一个字符(!!) d0或d home删除光标所在处到同行第一个字符。(!!) 复制 yy复制光标所在行(!!) nyy复制光标所在向下n行(n为数字) y1G复制光标所在行到第一行所有数据 yG复制光标所在行到最后一行所有数据 y$复制光标所在处到同行最后一个字符 y0复制光标所在处到同行第一个字符 p将已复制的数据粘贴到光标所在下一行 P将已复制的数据粘贴到光标所在上一行 复原 u复原前一个操作(类似于windows中的ctrl+z)!!!
编辑模式快捷键
一般模式 -> 编辑模式切换 i从光标所在处插入(!!!) I从所在行第一个非空白字符处插入(!!) a从光标所在下一个字符处插入 A从光标所在行最后一个字符处插入(!!) o在光标所在处下一行插入新的一行(!!) O在光标所在处上一行插入新的一行(!!) r替换光标所在处字符一次 R一直替换光标所在处文字直到按下Esc(!!!)
命令模式快捷键
:w [filename] 另存为filename :r [filename] 读取filename指定文件中的内容到光标所在的行。 :n1,n2 w [filename] 将n1到n2行另存为filename :! command 临时切换到命令行模式下执行command命令。 例如 “:!find / -name Helllo.java”即可在vim当中查看/home下面以ls输出的文件信息。 :wq 保存后离开 :q 不保存离开(未改可以离开,如果修改了需要q!强制离开) :q! 不保存离开 :set nu 显示行号 :set nonu 取消显示行号