Linux 做业和进程

1、处理信号

Linux利用信号与运行在系统中的进程进行通讯,进程的信号就是预约义好的一个消息,进程能识别它并决定是忽略仍是作出反应。进程如何处理信号是由开发人员经过编程来决定的,大多数编写完善的程序都能接收和处理标准Unix进程信号。Linux进程信号以下:shell

信号 名称 描述
1 SIGHUP 挂起进程
2 SIGINT 终止进程
3 SIGQUIT 中止进程
9 SIGKILL 无条件终止进程
15 SIGTERM 尽量终止进程
17 SIGSTOP 无条件中止进程,但不是终止进程
18 SIGTSTP 中止或暂停进程,但不终止进程
19 SIGCONT 继续运行中止的进程

~
进程和做业的区别:编程

  • 区别:进程是一个程序在一个数据集上的一次执行,而做业是用户提交给系统的一个任务。
  • 关系:一个做业一般包括几个进程,几个进程共同完成一个任务,即做业。
  • 用户提交做业之后,看成业被调度,系统会为做业建立进程,一个进程没法完成时,系统会为这个进程建立子进程。

1. 生成信号

bash shell容许用键盘上的组合键生成两种基本的Linux信号,在须要中止或暂停失控程序时很是方便。
1. 中断进程
CTRL+C组合键会生成SIGINT信号,并将其发送给当前shell中运行的全部进程。ubuntu

SIGINT

如图,执行sleep过程当中,使用CTRL+C能够中断此sleep命令。c#

2. 暂停进程
你能够在程序运行期间暂停进程,而无需终止它。CTRL+Z会生成一个SIGTSTP信号,中止shell中运行的任何进程。中止和终止进程不一样:中止进程会让程序继续保留在内存中,并能从上次暂停的位置继续运行。bash

sintstp

同理,咱们使用CTRL+Z时,能够发现此进程是暂停了,使用kill命令发送SIGKILL信号能够将其终止。服务器

2、后台模式运行脚本

之后台模式运行脚本或命令很是简单,只须要在命令后加一个&符号就能够了。以下示例:编辑器

shell bg

加上了&符号的sleep命令后,显示的第一行为做业号和PID,Linux系统中每一个进程都有惟一的PID。此时用jobs命令查看,会发现它正在running状态。当其运行完之后运行jobs能够发现:ide

root@ubuntu:~# jobs
[1]-  Done                    sleep 100
[2]+  Done                    sleep 200
  • 1
  • 2
  • 3

若是想在终端退出后做业仍之后台模式运行到结束,即便退出了终端会话,这能够用nohup命令来实现。nohup命令会将全部消息重定向到名为nohup.oout文件中,而不是显示在终端中。函数

jobs命令输出中的+和-
上面咱们运行了两个job,经过jobs命令输出是能够看到后面有加号和减号,这是什么意思呢?带加号的做业会被当作默认做业,当咱们不指定做业号时,该做业被当作做业命令的操做对象。而带减号的是下一个默认做业。以下图示例,使用bg将命令切换到后台。咱们也可使用bg 做业号来指定做业号将其放入后台,使用fg 做业号将其放入前台模式运行。ui

bg

当命令处于stopped状态时能够经过bg或fg使其运行起来。

3、定时运行做业

Linux中提供了at命令和cron表来设置在某个预设的时间运行脚本。

1. 用at命令来计划执行做业

at命令的基本格式为:at [-f filename] time,使用-f参数来指定用于读取命令的文件名。time指定了合适运行该做业,在指定time上面,支持的时间格式不少:
- 标准的小时和分钟格式,如18:34
- AM/PM指示符,指定上午下午
- 标准日期格式,如MMDDYY、DD.MM.YY等
- 时间增量,如now+25min等等

例如咱们要在三分钟后执行一个脚本,就能够用:at -f test1.sh now +3 min 来执行。执行以后,Linux系统就会将此做业提交到做业队列中,做业队列会保存经过at命令提交的待处理的做业。经过atq来查看当前的做业队列,而后能够经过atrm job_id来删除做业。

shell -at

然而,at命令只是执行一次的,若是想要重复按期执行,就须要使用crontab了。

2. 用crontab按期执行做业

Linux程序使用cron程序来安排要按期执行的做业,cron程序会在后台运行并检查crontab(即cron时间表),来获知安排执行的做业。
crontab的格式以下:

min hour dayofmonth month dayofweek command

min:分钟,0~59
hour:小时,0~23
dayofmonth:几号,1~31
month:月份,1~12
week:星期几,0~6(周日,周一...周六)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

好比,
在每周一早上十点执行命令:00 10 * * 1 command
每月的第一天12:00执行命令:00 12 1 * * command
若是是在每月的最后一天呢?由于有多是2九、30、31,因此要用其余的方法:如00 12 * * * if [ 'date +%d -d tomorrow' = 01 ]; then;command

1. 构造crontab
使用crontab -l来查看当前的cron时间表。
使用crontab -e来编辑crontab。输入crontab -e以后,会跳转到编辑器中,输入crontab命令便可。若是咱们对脚本运行时间的精确度要求不高的话,能够将其放在系统预置的cron脚本目录中便可:

crontab

如图中的cron.daily、cron.hourly、cron.monthly、cron.weekly。须要天天执行的脚本放在cron.daily中便可,其余相似。

2. anacron程序
cron程序存在的问题是它假定Linux是7X24h运行的,若是某个做业在crontab中安排的时间到了,但这时候Linux是关机状态的话,这个做业就不会执行。当系统开机后,cron程序不会再去运行那些错过的做业,要解决这个问题,能够用anacron程序。

anacron程序只会处理位于cron目录的程序,它用时间戳来决定做业是否在正确的计划间隔内运行了。每一个cron目录都有个时间戳文件,该文件位于/var/spool/anacron/目录下面:

root@ubuntu:~# cd /var/spool/anacron/
root@ubuntu:/var/spool/anacron# ls
cron.daily  cron.monthly  cron.weekly
  • 1
  • 2
  • 3
  • 4

anacron使用本身的时间表来检查做业目录,/etc/anacrontab以下:

root@ubuntu:/etc# ll |grep anacron
-rw-r--r--   1 root root      401 Dec 29  2014 anacrontab
root@ubuntu:/etc# cat anacrontab 
# /etc/anacrontab: configuration file for anacron

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root

# These replace cron's entries
1   5   cron.daily  run-parts --report /etc/cron.daily
7   10  cron.weekly run-parts --report /etc/cron.weekly
@monthly    15  cron.monthly    run-parts --report /etc/cron.monthly
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

anacrontab的格式为:period delay identifier command,period定义做业多就运行一次,以天为单位;delay以分钟为单位指定了系统启动后anacron须要等待多长时间再运行错过的做业;identifier 表示日志消息和错误邮件中的做业?command条目包含了run-parts程序和一个cron脚本名,如/etc/cron.daily等。
注意:anacron程序不会处理执行时间需求小于一天的脚本。

4、查看系统资源使用状况

也能够叫作进程管理,而进程管理的做用主要有三个:

  1. 判断服务器健康状态
  2. 查看系统中全部进程
  3. 杀死进程,释放资源

1. uptime

执行uptime以后,能够看见以下输出:

root@ubuntu:~# uptime
 12:07:29 up 2 min,  1 user,  load average: 0.25, 0.23, 0.09
  • 1
  • 2
  • 3

这个命令能够快速查看机器的负载状况,显示的是开机时间、用户数、负载,负载三个数字意思是1分钟、5分钟、15分钟CPU的平均负载状况。咱们应该怎么理解CPU平均负载呢?是否是其数值越小越好?结果并不是这样。

首先,咱们应该知道咱们的处理器有几个处理器,每一个处理器有几个核心,能够经过命令cat /proc/cpuinfo |grep "cpu cores"来查看。

在多核处理中,你的系统均值不该该高于处理器核心的总数量。

好比说你的机器是双核CPU,那么平均负载不该该高于2;若是是2个CPU,每一个CPU是4核的,那么平均负载不该该高于8。一般,应该关注于五分钟或者十五分钟的平均负载。

2. vmstat

vmstat用来得到有关进程、虚拟内存、页面交换空间及CPU活动的信息,能够全面反映系统的负载状况。经常使用的方式是vmstat命令经过两个数字参数来统计信息,第一个参数是采样的时间间隔数,单位是秒,第二个参数是采样的次数,如:

root@ubuntu:~# vmstat 3 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 820216  37088 507628    0    0    42     2   41   65  0  0 99  0  0
 0  0      0 820216  37088 507628    0    0     0     0  356  495  0  0 99  0  0
 1  0      0 745040  37120 507636    0    0     0   111  990 1409  3 18 79  1  0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

上面的信息统计的是每隔3秒、统计共3次的状态。每个栏位表明的是什么意思呢?
proc进程:
r:等待在CPU资源的进程数。这个数据比平均负载更加可以体现CPU负载状况,数据中不包含等待IO的进程。若是这个数值大于机器CPU核数,那么机器的CPU资源已经饱和。
b :表示阻塞的进程

Memory内存

swpd:正在使用虚拟的内存大小,单位k
free:空闲内存大小
buff:已用的buff大小,对块设备的读写进行缓冲
cache:已用的cache大小,文件系统的cache

Swap交换内存
si:每秒从交换区写入内存的大小(单位:kb/s)
so:每秒从内存写到交换区的大小

IO 磁盘
bi:每秒读取的块数(读磁盘),这里的块设备是指系统上全部的磁盘和其余块设备,默认块大小是1024byte
bo:每秒写入的块数(写磁盘)

system
in:每秒中断数,包括时钟中断
cs:每秒上下文切换数(每次调用系统函数,咱们的代码就会进入内核空间,致使上下文切换,这个很耗资源,也要尽可能避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,致使CPU干正经事的时间少了,CPU没有充分利用,是不可取的。)
这两个值越大,会看到由内核消耗的cpu时间会越多。

CPU(百分比)
Us:用户进程执行消耗cpu时间(user time)。us的值比较高时,说明用户进程消耗的cpu时间多
Sy:系统进程消耗cpu时间(system time)。sys的值太高时,说明系统内核消耗的cpu资源多,这个不是良性的表现,咱们应该检查缘由。
Id:空闲时间(包括IO等待时间)
Wa:等待IO时间。Wa太高时,说明io等待比较严重,这多是因为磁盘大量随机访问形成的,也有多是磁盘的带宽出现瓶颈。

3. free

free命令能够查看系统内存的使用状况。

root@ubuntu:~# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.9G        650M        795M         16M        536M        1.1G
Swap:          1.0G          0B        1.0G
  • 1
  • 2
  • 3
  • 4
  • 5

-h表示以易读的单位显示。

4. top

top命令包含了前面好几个命令的检查的内容。好比系统负载状况(uptime)、系统内存使用状况(free)、系统CPU使用状况 (vmstat)等。所以经过这个命令,能够相对全面的查看系统负载的来源。同时,top命令支持排序,能够按照不一样的列排序,方便查找出诸如内存占用最 多的进程、CPU占用率最高的进程等。选项的使用及输出的信息也和前面相似。

#经常使用操做
top   //默认,每隔5秒显式全部进程的资源占用状况
top -d n  //delay每隔n秒显式全部进程的资源占用状况
top -p 1234 -p 6789//每隔5秒显示pid是1234和pid是6789的两个进程的资源占用状况
top -d 2 -p 123 //每隔2秒显示pid是123的进程的资源使用状况
  • 1
  • 2
  • 3
  • 4
  • 5

下面简单的介绍一下top命令的输出,便于去查看资源的使用状况。

#top命令的输出

#第一行为开机时间,用户数,负载。和uptime输出相似
top - 13:54:48 up  1:49,  1 user,  load average: 0.00, 0.00, 0.00
#第二行为总进程数,正在运行的、睡眠的、中止的、僵尸进程。
Tasks: 251 total,   1 running, 246 sleeping,   4 stopped,   0 zombie
#第三行为CPU的使用状况,和vmstat中输出的相似
%Cpu(s):  0.3 us,  1.3 sy,  0.0 ni, 98.4 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
#第四行为内存的使用
KiB Mem :  2030472 total,   671712 free,   714120 used,   644640 buff/cache
#第五行为交换内存的状况
KiB Swap:  1046524 total,  1046524 free,        0 used.  1100272 avail Mem 

#主要的几个值为: NI “nice值,负值表示高优先级,正值表示低优先级”、 VIRT “进程使用的虚拟内存总量”、RES “进程使用的、未被换出的物理内存大小”、 SHR “共享内存大小”、S “进程状态”、TIME+ “进程使用CPU总时间”
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
相关文章
相关标签/搜索