如何产生进程?
示例
Linux启动的第一个进程
[root@localhost ~]# pidof init
1
进程演示
[root@localhost ~]# ps a
vim install.log
图像界面新开一个Terminal#vim install.log
进程查看命令
ps(process status) :将某个时间点的程序运作情况截取下来
选项和参数
a :(all)(和输入终端(terminal) 关联的所有 process,通常与x一起使用,列出完整信息。
x :后台进程,通常与 a 这个参数一起使用,可列出较完整信息
u :有效使用者 (effective user) 相关的 process
常用的进程查看命令
示例
[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动态观察进程的变化
选项与参数
-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 的所属账号名称。
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
系统资源监控命令
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); 。
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 以后才支持)
在当前bash执行多个任务
如: 我们需要复制一个很大的文件 , 和对另一个文件执行编译操作 时 , 可以让某一任务在后台执行
比如:cp file1 file2 &
重点在以上的这个“&”符号,他表示将file1这个文件复制为file2,同时将这个拷贝进程放到后台执行。
也就是说执行这一个命令之后,在这一个终端仍然可以做其他的工作。拷贝任务执行完成后,系统将会在终端显示完成的消息。
示例
[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 介绍
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。
该模式下可以输入文件内容。
按下返回一般模式。
命令模式
在一般模式当中,输入:/?三个字符中的任何一个按钮,就可以将光标移动到最下面那一行。
在这个模式当中,可以提供查询、替换等功能。同时存盘(保存)、离开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 取消显示行号