一、进程的概念

 程序在执行的过程中,会产生一些进程,它是由程序发送指令,然后从硬盘中读取数据,调到内存当中。进程的发起是由三方产生,用户→程序→作用对象。

二、进程的分类

进程主要分为两类
 前台进程:前台进程是由终端发起和控制,也就是说,前台进程需要依靠于这个终端,如果终端关闭,该进程也自动关闭。
 后台进程:后台进程一般不会随着终端的管理而关闭,他会在后台自动运行。

三、守护进程

 守护进程也是后台进程,这些进程会随着系统的启动而自动启动,他们作为服务会一直运行,它们不会关闭。

四、进程的创建

 所有的进程都是有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值。

linux进程管理和计划任务

七、查看系统中的进程

静态显示当前系统资源使用率的命令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> <EOT>
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
~