Linux进程和计划任务
本章内容:
进程相关概念
进程及系统相关工具
计划任务
进程概念:
内核功能:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等;
process:在内存中运行的程序被称为进程。
task struct:Linux内核存储进程信息的数据结构格式
task list:多个任务的task list组成的链表
进程的创建:
centos5、6中的第一个进程为:init
进程:都有其父进程创建,COW(写时复制)
进程优先级:
系统优先级:数字越小,优先级越高
0–139:(centos4,5)
0–99 :(centos6)
实时优先级:99–0:数值越大优先级越高
nice值:-20–19:对应的系统优先级100-139或99
进程内存:
page frame:页框,用存储页面数据,存储page 4k
LRU:近期最少使用算法,释放内存
MMU:内存管理单元,负责转换线性和物理地址
Linux内核:抢占式多任务
进程类型:
守护进程:daemon,在系统引导过程中启动的进程,和终端无关的进程。
前台进程:跟终端相关,通过终端启动的进程。
注意:两者可以相互转化。
进程状态:
运行态:running
就绪态:ready
睡眠态:
可中断:interruptable
不可中断:uninterruptable
停止态:stopped,暂停于内存中,但不会被调度,除非手动启动。
僵死态:zombie,结束进程,父进程结束前,子进程不关闭。
系统管理工具:
进程的分类:
CPU-bound:CPU密集型,非交互。
IO-Bound:IO密集型,交互。
Linux系统状态的查看及管理工具:
pstree、ps、pidof、pgrep、top、htop、glance、pmap、vmstat、dstat、kill、pkill、job、bg、fg、nohup
pstree命令:查看进程树
pstree [options]
-p:可以列出对应进程的PID号;
-u:列出进程对应的用户名;
-a:列出完整的命令信息;
ps命令:查看静态的进程统计信息
ps [options]
a:显示当前终端下的所有进程信息;
u:使用以用户为主的格式输出进程信息;
x:显示当前用户在所有终端下的进程信息;
-e:显示系统内的所有进程信息;
-l:使用长格式显示进程信息;
-f:使用完整的格式显示进程信息;
执行“ps aux”命令后,将以列表的形式输出所有进程信息,其中各字段的含义如下
USER:启动该进程的用户账号的名称。
PID:该进程在系统中的PID号,在当前系统时唯一的。
TTY:表明该进程在哪个终端上运行,“?”表示未知或不需要的终端。
STAT:显示了进程当前的状态,如S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)l(多线程进程)T(停止状态)D(不可中断休眠)对于僵死状态的进程应该手动终止掉。
START:启动该进程的时间。
TIME:该进程占用CPU的时间。
COMMAND:启动该进程的命令的名称。
%CPU:CPU占用百分比。
%MEM:内存占用百分比。
VSZ:占用虚拟内存(swap空间)的大小。
RSS:占用常驻内存(物理内存)的大小。
搜索进程:
pgrep命令:查询特定进程信息的专用工具。
pgrep [options] patter
-u:真正运行命令生效的用户
-U:真正发起运行命令的用户
-t:与指定终端相关的进程
-l:显示进程名
-a:显示完整格式的进程名
-p:显示父进程为此指定的进程的进程列表
示例:
[root@centos6 proc]# pgrep -l bash
4128 bash
6761 bash
6780 bash
[root@centos6 proc]#
pidof命令:查询指定进程的pid号。
示例:
[root@centos6 proc]# pidof bash
6780 6761 4128
[root@centos6 proc]#
uptime命令:查看系统的平均负载
显示当前系统时间,系统已经启动多久,当前登录系统的人数,系统的平均负载(1、2、10分钟的平均负载,一般不会超过1)
系统平均负载:
指在特定时间间隔内运行队列中的平均进程数。
如果每个cpu内核的当前活动进程数不大于3的话,那么系统性能良好。如果每个CPU内核的任务大于5,那么这台机器的性能有严重的问题。
如果Linux主机是1个双内核CPU的话,当load average为6的时候说明机器已经被充分使用了。
示例:
[root@centos6 Desktop]# uptime
10:49:46 up 25 min, 2 users, load average: 0.14, 0.10, 0.18
[root@centos6 Desktop]# (平均负载)
top命令:进程管理工具,有许多内置的命令
选项:
-d#:指定刷新时间间隔,默认为3秒
-b:以批次方式显示
-n#:显示多少批次
排序:
P:以占据的cpu百分比,%CPU进行排序;
M:占据内存百分比,%MEM进行排序;
T:累计占据CPU的时长进行排序;
首部信息显示:
uptime信息 :按l 键可以“屏蔽/显示” uptime平均负载
tasks及CPU信息:按 t 键可以“屏蔽/显示”tasks及CPU信息
CPU分别显示:按 1(数字)可以把所有CPU单个显示
memory信息:按 m 键可以“屏蔽/显示”内存和swap的信息
退出top命令:q
修改刷新时间间隔: 按s键 后跟上要间隔的刷新时间(以秒为单位)
终止指定的进程:k
保存文件:W
栏位信息简介:
us:用户空间
sy:内核空间
ni:调整nice时间
id:空闲
wa:等待IO时间
hi:硬中断
si:软中断
st:被虚拟机偷走的时间
htop命令:进程管理工具,需从Fedora-EPEL源安装
选项:
-d#:指定延迟时间
-u:仅显示指定用户的进程
-s:以指定字段进行排序
vmstat命令:显示虚拟内存信息
vmstat [options] [delay[count]]
-s:显示内存的统计数据
示例: 每秒刷新一次,显示5次
[root@centos6 Desktop]# vmstat 1 5
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 270616 70172 278980 0 0 12 1 47 66 0 0 99 1
0 0 0 270536 70172 279012 0 0 0 0 109 131 1 0 100 0 0
0 0 0 270536 70172 279012 0 0 0 0 110 148 1 1 99 0 0
0 0 0 270536 70172 279012 0 0 0 0 93 118 1 0 100 0 0
0 0 0 270536 70172 279012 0 0 0 0 96 133 0 0 100 0
[root@centos6 Desktop]#
pmap命令:查看进程的内存映射
pmap [options] pid
-x:显示详细格式的信息
另一种查看方式是:
#cat /proc/PID/maps
示例:
[root@centos6 Desktop]# pgrep bash
3290
[root@centos6 Desktop]# pmap -x 3290
3290: /bin/bash
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 852 536 0 r-x– bash
00000000006d4000 36 36 36 rw— bash
00000000006dd000 24 24 24 rw— [ anon ]
00000000008dc000 36 8 0 rw— bash
0000000001f5a000 264 248 248 rw— [ anon ]
0000003f24400000 128 112 0 r-x– ld-2.12.so
…………………………………………………………………………….
[root@centos6 Desktop]#
glances命令:系统监控工具 (需要从EPEL源安装)
示例:
[root@centos6 Desktop]# glances
C/S模式下运行glances 可以实现远程监控其他主机,适用于局域网内;
服务器端设置:
glances -s -B IPADDR
-s:指明是服务器端
-B:绑定要监控的服务器的IP地址
客户端模式:
glances -c IPADDR
-c:指明是客户端
IPADDR:指明要监控的服务端地址
示例:
测试环境说明:
centos 7 为服务器端,IP地址为:192.168.3.10
centos 6 为客户机端,IP地址为:192.168.3.2
服务器模式配置:
[root@centos7 Desktop]# glances -s -B 192.168.3.10
客户机端模式端,监控centos7
[root@centos7 Desktop]# glances -c 192.168.3.10
dstat命令:系统资源统计
dstat [-afv] [options..] [delay [count]]
-c:显示CPU相关的信息
-d:显示disk相关的信息
-g:显示page相关的统计数据
-m:显示memory相关的统计数据
-n:显示network相关的统计信息
-p:显示process相关的统计数据
-r:显示IO请求相关的统计数据
-s:显示swapped相关的统计数据
–top-cpu:显示最占cpu的进程
–top-io:显示最占用io的进程
–top-mem:显示最占用内存的进程
–top-latency:显示延迟最大的进程
示例:每隔1秒统计一次,一共统计5次
[root@centos6 Desktop]# dstat 1 5
—-total-cpu-usage—- -dsk/total- -net/total- —paging– —system–
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
0 0 99 1 0 0| 25k 1837B| 0 0 | 0 0 | 93 132
0 0 100 0 0 0| 0 0 | 0 0 | 0 0 | 87 123
1 1 99 0 0 0| 0 0 | 0 0 | 0 0 | 127 143
2 1 97 0 0 0| 0 0 | 0 0 | 0 0 | 179 183
1 2 97 0 0 0| 0 0 | 0 0 | 0 0 | 149 148
1 1 98 0 0 0| 0 0 | 0 0 | 0 0 | 112 124
[root@centos6 Desktop]#
kill、killall、pkill命令:终止进程
kill命令向进程发送控制信号,以实现对进程的管理
显示当前系统可用信号:kill -l
常用信号:
1)SIGHUP:无需关闭进程而让其重读配置文件;
2)SIGINT:终止正在运行的进程,相当于ctrl+c;
9)SIGKILL:杀死正在运行的进程;
15)SIGTERM:终止正在运行的进程;
18)SIGCONT:继续运行
19)SIGSTOP:后台休眠
指定信号的方法:
(1)信号数字识别:1,2,3….
(2)信号的完整名称:SIGHUP
(3)信号的简写名称:HUP
kill命令:
使用kill命令终止进程时,需要使用进程的PID号作为参数;无特定选项信号时,kill命令将给该进程发送终止信号并正常退出,若该进程已经无法响应终止信号,则可以结合“-9”选项强行杀死进程。
示例:
[root@centos6 ~]# pgrep -l vim
5031 vim
[root@centos6 ~]# kill 5031
[root@centos6 ~]# pgrep -l vim
[root@centos6 ~]#
killall命令:
使用killall命令可以通过进程名来杀死进程,当需要结束系统中多个相同名称的进程时,使用killall命令将更加方便,效率更高。killall命令也同样可以结合“-9”选项以强制结束进程。
示例:
[root@centos6 ~]# vim f1
[1]+ Stopped vim f1 //crtl+z挂起至后台
[root@centos6 ~]# pgrep -l vim
5297 vim
[root@centos6 ~]# killall -9 vim
[root@centos6 ~]# pgrep -l vim
[1]+ Killed vim f1 //已杀死vim进程
[root@centos6 ~]#
pkill命令:
使用pkill命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性终止特定的进程,如“-U”指定用户,“-t”指定终端等。
示例:
1)终止用户zheng所在的终端:使用选项“-t”
[root@centos6 ~]# who
zheng tty2 2016-09-17 19:28
root tty1 2016-09-17 10:25 (:0)
root pts/1 2016-09-17 17:36 (:0.0)
[root@centos6 ~]# pkill -9 -t tty2
[root@centos6 ~]# who
root tty1 2016-09-17 10:25 (:0)
root pts/1 2016-09-17 17:36 (:0.0)
[root@centos6 ~]#
2)终止用户zheng所在的终端:使用选项“-U”
[root@centos6 ~]# who
zheng tty2 2016-09-17 19:32
root tty1 2016-09-17 10:25 (:0)
root pts/1 2016-09-17 17:36 (:0.0)
[root@centos6 ~]# pkill -9 -U zheng
[root@centos6 ~]# who
root tty1 2016-09-17 10:25 (:0)
root pts/1 2016-09-17 17:36 (:0.0)
[root@centos6 ~]#
Linux的作业控制:
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可以通过终端启动,但启动后即转入后台运行
如何让作业运行与后台?
(1)运行中的作业可以执行:ctrl+z
(2)未启动的作业可以执行:#command &
以上此类后台作业虽然被送往后台运行,但其依然与终端相关,退出终端,将关闭后台作业,如果希望送往后台后剥离与终端的关系可以执行以下命令:
#nohup command & #screen;command
示例: 使用nohup命令剥离后台命令ping与终端的关系,即使断网也会继续运行。
[root@centos6 ~]# nohup ping 127.0.0.1 &
[1] 5886
[root@centos6 ~]# nohup: ignoring input and appending output to `nohup.out'
jobs命令:查看所有与终端相关的后台运行的作业
jobs -l :查看所有后台运行的作业;
示例:
[root@centos6 ~]# vim f1 &
[1] 5905
[root@centos6 ~]# jobs -l //查看所有后台运行的作业;
[1]+ 5905 Stopped (tty output) vim f1
[root@centos6 ~]#
fg命令:可以将后台的进程任务重新调入终端前台执行;只需指定后台任务对应的顺序编号,可以通过jobs命令获取。
示例:将后台的vim f1调到前台工作
[root@centos6 ~]# jobs -l
[1]+ 5905 Stopped (tty output) vim f1
[root@centos6 ~]# fg 1
bg命令:让送往后台的作业在后台继续运行;
示例:
[root@centos6 ~]# 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.046 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.041 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.054 ms
^Z //ctrl+z 调到后台
[2]+ Stopped ping 127.0.0.1
[root@centos6 ~]# bg 2 //把在后台停止的ping在后台运行起来
[2]+ ping 127.0.0.1 &
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.127 ms
[root@centos6 ~]# 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.055 ms
并行运行:
让两个或多个脚本同时运行,需写脚本的绝对路径,后必须加“&”符。
示例:
编写3个循环脚本
[root@centos6 testdir]# cat f1.sh f2.sh f2.sh
#!/bin/bash
while true;do
echo "f1.sh"
sleep 1
done
#!/bin/bash
while true;do
echo "f2.sh"
sleep 1
done
#!/bin/bash
while true;do
echo "f2.sh"
sleep 1
done
[root@centos6 testdir]#
第一种并行运行脚本方法:
[root@centos6 testdir]# (/testdir/f1.sh&);(/testdir/f2.sh&);(/testdir/f3.sh&)
第二种并行运行脚本方法:
[root@centos6 testdir]{ /testdir/f1.sh&/testdir/f2.sh&/testdirf3.sh& }
第三种并行运行脚本方法:
编写一个脚本,把f1、f2、f3脚本放进去。
[root@centos6 testdir]# cat all.sh
#!/bin/bash
#
/testdir/f1.sh&
/testdir/f2.sh&
/testdir/f3.sh&
[root@centos6 testdir
执行all.sh脚本并行处理f1、f2、f3脚本
[root@centos6 testdir]# source all.sh
nice命令:调整进程优先级
示例:
[root@centos6 testdir]# nice -n -10 ping 127.0.0.1
查看设定的优先级:
[root@centos6 testdir]# ps axo pid,comm,ni
renice命令:重新设定进程优先级
renice [-n] priority pid
计划任务管理:
在Linux系统中,通过atd、crond这两个系统服务实现一次性、周期性计划任务的功能,并分别通过at、crontab命令进行计划任务的设定。
使用at命令设置的计划任务只在指定的时间点执行一次,有一个前提是,对应的系统服务at必须运行。
使用crontab命令设置的计划任务可以按预设的周期重复执行,可以大大减轻重复设置系统管理任务的操作。有一个前提是,对应的系统服务crond必须运行。
at 命令:
at [options] TIME
常用选项:
-q:队列
-l:查看当前系统中设置的at计划任务列表,相当于atq
-d:删除指定任务编号的作业,相当于atrm
-c:查看具体的作业任务。
-f:从指定的脚本文件中读取任务
-m:强制at发邮件表示执行完毕
TIME:
HH:MM [yyyy-mm-dd]
noon midnight teattime
tomorrow
now+#{minutes hours days weeks}
ctrl+d:提交一次性计划任务
at一次性计划任务:
执行方式:
1)交互式 2)输入重定向 3)at -f scriptsfile
依赖atd服务,需要启动才能实现at一次性计划任务
at队列存放在/var/spool/at目录中
/etc/at.{allow ,deny}控制用户是否能执行at任务
白名单:/etc/at.allow默认不存在,只有该文件中的用户才能执行at命令
黑名单:/etc/at.deny拒绝该文件中的用户执行at命令,而没有在at.deny文件中的用户可以执行at命令。
如果两个文件都不存在,则只有root可以执行at命令。
at命令:执行的一次性计划任务是存放在/var/spool/at目录下的
示例:
[root@centos6 at]# at 15:22
at> wall hello
at> <EOT>
job 6 at 2016-09-18 15:22
[root@centos6 at]# pwd
/var/spool/at
[root@centos6 at]# ls
a000060176e77a spool
[root@centos6 at]#
at命令的“-f”选项:从指定的脚本文件中读取任务。
示例:
[root@centos7 testdir]# cat sum100.sh
#!/bin/bash
echo "==============================="
i=1
sum=0
while [ $i -le 100 ];do
let sum=$sum+$i
let i++
done
echo "1 to 100 sum :$sum"
echo "=============================="
unset i
unset sum
[root@centos7 testdir]#
[root@centos7 ~]# at 3:45 -f /testdir/sum100.sh
job 3 at Sun Sep 18 03:45:00 2016
[root@centos7 ~]#
注: at的执行结果需去mail邮件中查看。
注意:作业执行命令的结果中的“标准输出”和“错误输出”以邮件通知给相关用户。
示例:
[root@centos7 ~]# at 3:05
at> wall “da jia hao”
at> echo “at test”
at> <EOT> //ctrl+d提交计划任务
job 2 at Sun Sep 18 03:05:00 2016
[root@centos7 ~]# at -l
2 Sun Sep 18 03:05:00 2016 a root
[root@centos7 ~]#
Broadcast message from root@centos7 (Sun Sep 18 03:05:01 2016):
da jia hao
You have new mail in /var/mail/root //echo执行的结果是标准输出,所以有邮件通知
[root@centos7 ~]#
crontab周期性计划任务
使用crontab命令设置的计划任务可以按预设的周期重复执行,可以大大减轻重复设置系统管理任务的操作。有一个前提是,对应的系统服务crond必须运行。
centos7:systemctl status crond
centos6:service crond status
周期性计划任务提交给crond,到指定的时间会自动运行。
系统crond任务:系统维护计划任务
/etc/crontab
用户crond任务:
crontab命令
日志:/var/log/cron
用户自行定义的cron任务将被保存在目录“/var/spool/cron”中,文件名与对应的用户账号同名。
用户crontab周期性计划任务
crontab命令定义,每个用户都有专用的cron任务文件:
/var/spool/cron/USERNAME
crontab命令语法:
crontab [options]
-u:仅root可以运行,指定用户管理cron任务;
-e:编辑计划任务;
-r:删除计划任务;
-l:显示计划任务列表;
-i:同“-r”一同使用,已交互模式移除指定的计划任务;
crontab计划任务时间表示法:
(1)特定值:给定时间点有效取值范围内的值
(2)*:表示“每”
(3)离散值:#,#,# 例如:1,3,5,9
(4)连续值:#-# 例如:2-6
(5)在指定的时间范围上,定义步长 /#:#即为步长,例如:*/5
时间格式:
@reboot run once after reboot
@yearly 0 0 1 1 *
@annually 0 0 1 1 *
@monthly 0 0 1 * *
@weekly 0 0 * * 0
@daily 0 0 * * *
@hourly 0 * * * *
sleep命令:
sleep NUMBER [SUFFIX]…
SUFFIX:
s:秒,默认
m:分
h:小时
d:天
usleep:微秒;
注意:
运行结果的标准输出和错误输出以邮件通知给相关的用户。
command > /dev/null
command &> /dev/null
对于cron任务来说,%有特殊的用途;如果在命令中要使用%,则需要转义,不过,如果把%放置在单引号中,也可以不用转义。
系统cron任务:/etc/crontab
示例:晚上9点10分以zheng用户执行一个echo “hello”
1 SHELL=/bin/bash
2 PATH=/sbin:/bin:/usr/sbin:/usr/bin
3 MAILTO=root
4 HOME=/
5
6 # For details see man 4 crontabs
7
8 # Example of job definition:
9 # .—————- minute (0 – 59)
10 # | .————- hour (0 – 23)
11 # | | .———- day of month (1 – 31)
12 # | | | .——- month (1 – 12) OR jan,feb,mar,apr …
13 # | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
14 # | | | | |
15 # * * * * * user-name command to be executed
10 9 * * * zheng /bin/echo “hello”
用户cron任务:crontab -e
[root@centos6 ~]# crontab -e
22 20 * * * /bin/echo "hello"
0 0 * * * /sbin/shutdown -h now
示例:执行用户计划任务,让其到点休眠1分钟,在执行wall
[root@centos6 ~]# crontab -e
16 21 * * * /bin/sleep 1m;/usr/bin/wall "hello"
原创文章,作者:zhengyibo,如若转载,请注明出处:http://www.178linux.com/48353