一、进程的概念
程序在执行的过程中,会产生一些进程,它是由程序发送指令,然后从硬盘中读取数据,调到内存当中。进程的发起是由三方产生,用户→程序→作用对象。
二、进程的分类
进程主要分为两类
前台进程:前台进程是由终端发起和控制,也就是说,前台进程需要依靠于这个终端,如果终端关闭,该进程也自动关闭。
后台进程:后台进程一般不会随着终端的管理而关闭,他会在后台自动运行。
三、守护进程
守护进程也是后台进程,这些进程会随着系统的启动而自动启动,他们作为服务会一直运行,它们不会关闭。
四、进程的创建
所有的进程都是有init(CentOS6之前,CentOS7是sysetmd)所创建,一切进程都是有他所创建,可以称之为所有进程的"祖先"所有的进程都是通过fork(),clone(),system()所创建,system()函数创建函数方法相对简单,但是安全性不高,而fork()和exec()函数灵活性、速度、以及安全性比较好,所以一般都会使用这两种方法来创建进程。
五、进程状态显示
R:running(运行)
S: interruptable sleeping(可中断睡眠状态)
D: uninterruptable sleeping(不可中断睡眠状态)
T: stopped(停止)
Z: zombie(僵尸)
+: 前台进程
l: 多线程进程
L:内存分页并带锁
N:低优先级进程
<: 高优先级进程
s: session leader,会话(子进程)发起者
六、进程优先级
系统优先级:在centos5之前进程优先级0-139,在centos6之后进程优先级0-98。
实时优先级:99-0,值越大,优先级有高,
nice值:-20到19,对应系统优先级100-139或99,一般设置系统优先级都是设置nice值。
七、查看系统中的进程
静态显示当前系统资源使用率的命令ps,ps命令在选项上有三种格式分别是 :UNIX、BSD、GNU,这里主要以BSD选项来说明
选项
默认显示当前终端中的进程
a:显示都有终端的进程
x:显示所有后台进程
u:显示进程所有者
f:显示进程的父进程
k 属性:针对指定属性进程排序
o 属性1,属性2:显示定制信息,都可以定制:user(执行用户),pid(进程号 )、comm(进程名)、%cp(cpu)u、%mem(内存)、state(状态)、tty(终端)、euser(执行人)、ruser(发起人)、cmd(命令),vsz(承诺内存)rss(实际内存)time(运行时间),ni(nice值),pri(优先级),psr(CPU编号),rtprio(实时优先级)等等
[root@centos6 bin]#ps aux |head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 19236 1500 ? Ss 08:09 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 08:09 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 08:09 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S 08:09 0:00 [ksoftirqd/0]
动态显示当前系统使用情况top命令
可以动态的监控系统资源使用情况
top - 10:07:50 up 1:57, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.8%us, 2.2%sy, 0.0%ni, 96.8%id, 0.0%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 1906256k total, 209412k used, 1696844k free, 11132k buffers
Swap: 2097148k total, 0k used, 2097148k free, 59652k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19236 1500 1228 S 0.0 0.1 0:01.75 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
dstat命令显示当前系统资源使用情况统计
[root@centos6 etc]#dstat #默认显示
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 1 99 0 0 0|2462B 2358B| 0 0 | 0 0 | 33 61
0 0 100 0 0 0| 0 0 |1524B 838B| 0 0 | 21 10
0 0 100 0 0 0| 0 0 |1584B 358B| 0 0 | 33 17
1 0 99 0 0 0| 0 0 |1704B 358B| 0 0 | 22 10
0 1 99 0 0 0| 0 0 |1796B 358B| 0 0 | 29 14
0 0 100 0 0 0| 0 0 |1856B 358B| 0 0 | 29 14
1 1 98 0 0 0| 0 156k|1856B 358B| 0 0 | 50 25
八、进程管理工具
kill命令是想进城发送控制信号,进程根据信号来判断动作。
常用选项
-0:无作为,一般对于测试某进程是否开启
-1:强制性的让进程重新读取配置文件
-2:终止正在运行的进程,相当于Ctrl+c
-3:相当于ctrl+\
-9:强制杀死正在运行的进程
-15:终止正在运行的进程
-18:继续运行被暂定的进程
-19:把前台的进程调到后台休眠
跟kill作用相同的还有killall命令,该命令可以不输入PID号,直接输入进程名, 只要是该进程名的进程都有效,一般针对于一个名字的好多进程
九、作业控制
当有一些执行时间比较长的命令,比如需要拷贝一些大文件到别的地方,则该终端将不可以使用,这样就用到了后台运行命令
查看当前终端的作业命令是jobs
当执行占用终端时间长的命令时,可以用Ctrl+z暂停并放入后台如下
[root@centos6 bin]#ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.020 ms
^Z
[1]+ Stopped ping 127.0.0.1
但是终端是释放了,但是命令也跟着暂停了,那么就可以使用bg来放入后台继续运行,如果想要把后台的程序重新调到前台则可以使用fg。
根据上述描述,命令占用终端是解决的了,但是这些命令还是基于当前终端来运行的, 如果将当前终端关闭,那么对于当前终端所执行的所有命令也将被终端,那么还是不够完美。
想要把运行命令改变成不终端的方法有三种
方法一:nohup 命令 &>/dev/null
方法二:在终端中输入screen,会进入一个新的shell,这个shell不基于任何bash,就算终端关闭 ,在该终端中的所有操作也不会被关闭,该命令的优点还有如果有需要重新调回命令,还可以重新连接,根据screen -ls 查看会话screen -x 会话名重新连接
方法三:(命令) 该方法跟nohup大致相同不可被调回
以上三种方法都可以不依赖于任何终端的执行命令
十、并行运行命令
为提高工作效率,对于一些没有先后顺序的命令,我们可以采用同时运行的方法从而实现提高命令的执行效率
方法一、写脚本,让一个总的脚本调用多个脚本,并且把多个脚本放入后台运行
如下所示:同时调用多个脚本并且把多个脚本同时放入后台运行
[root@centos6 bin]#cat bingxing.sh
#!/bin/bash
jiaoben1.sh&
jiaoben2.sh&
jiaoben3.sh&
方法二、用()来把所有脚本,命令调入后台,多进程执行
[root@centos6 bin]#(jiaoben1.sh&);(jiaoben2.sh&);(jiaoben3.sh&)
方法三、用{}来把所有进程放入后台
[root@centos6 bin]#{jiaoben1.sh& jiaoben2.sh& jiaoben3&}
十一、计划任务
使系统定期的执行一些操作
at:让系统在未来执行某些任务,比如发个广播
选项
-l:查看指定队列中等待的计划任务,如果计划任务已经执行将不再显示。
-d:删除指定的计划任务
-c:查看计划任务的详细信息
-f 文件:从指定文件中欧读取任务
-m:当计划任务被执行后,将给用户发送邮件,即使咩有标准输出,也会发送一个空邮件给用户
[root@centos6 app]#at 15:30 #创建在15点30分是发送一个广播
at> wall test
at>
job 8 at 2018-03-18 15:30
[root@centos6 app]#at -l #查看计划任务
8 2018-03-18 15:30 a root
crontab:让系统在规定的时间循环执行某些操作
系统级计划任务,直接编辑配置文件,文件格式如下。
[root@centos6 app]#vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
分钟 小时 日 月 星期 用户 操作 #计划任务分为这几列
注:当计划任务的服务没有启用,计划任务将不再执行。
创建用户级计划任务
[root@centos6 app]#crontab -e #默认那个用户编辑,将是哪一个用户的计划任务
00 8 * * * /testdir/1.sh #在每天的8点执行指定的脚本,格式同上一一致
还可以指定在哪一个时刻指定某目录下的所有计划任务
[root@centos6 etc]#vim /etc/cron.d/0hourly
#可以在该文件下指定时间并且指定需要指定脚本的目录run-parts是一个命令,
HELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly
~