Linux环境下进程和计划任务管理
程序时保存在外部存储介质(如硬盘)中的可执行机器代码和数据的静态集合,而进程实在CPU及内存中处于动态执行状态的计算机程序。在Linux系统中,每个程序启动后可以创建一个或多个进程。
1
ps命令——查看静态的进程统计信息
ps命令是Linux系统中最为常用的进程查看工具,主要用于显示包含当前运行的各进行完整信息的静态快照。通过不同的命令选项,可以选择性的查看进程信息。
-
a:显示当前终端下的所有进程信息,包括其他用户的进程。与“x”选项结合时将显示系统中所有的进程信息。
-
u:使用以用户为主的格式输出进程信息。
-
x:显示当前用户在所有终端下的进程信息。
-
-e:显示系统内的所有进程信息。
-
-l:使用长格式显示进程信息。
-
-f:使用完整的格式显示进程信息。
执行“ps aux”命令后,将以简单列表的形式显示出进程信息。
下述输出信息中,第1行为列表标题,其中各字段的含义描述如下:
USER:启动该进程的用户账号的名称。
PID:该进程在系统中的数字ID号,在当前系统中是唯一的。
%CPU:CPU占用的百分比。
%MEM:内存占用的百分比。
VSZ:占用虚拟内存swap空间的大小。
RSS:占用常驻内存物理内存的大小。
TTY:表明该进程在哪个终端上运行。“?”表示未知或不需要终端。
STAT:显示了进程当前的状态,S:休眠、R:运行、Z:僵死、<:高优先级、N:低优先级、s:父进程、+:前台进程。
START:启动该进程的时间。
TIME:该进程占用的CPU时间。
COMMAND:启动该进程的命令的名称。
[[email protected] ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.1 19364 1540 ? Ss 12:19 0:01 /sbin/init
root 2 0.0 0.0 0 0 ? S 12:19 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 12:19 0:00 [migration/0]
root 4 0.0 0.0 0 0 ? S 12:19 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S 12:19 0:00 [migration/0]
root 6 0.0 0.0 0 0 ? S 12:19 0:00 [watchdog/0]
root 7 0.0 0.0 0 0 ? S 12:19 0:00 [migration/1]
root 8 0.0 0.0 0 0 ? S 12:19 0:00 [migration/1]
root 9 0.0 0.0 0 0 ? S 12:19 0:00 [ksoftirqd/1]
root 10 0.0 0.0 0 0 ? S 12:19 0:00 [watchdog/1]
root 11 0.0 0.0 0 0 ? S 12:19 0:00 [events/0]
root 12 0.0 0.0 0 0 ? S 12:19 0:00 [events/1]
root 13 0.0 0.0 0 0 ? S 12:19 0:00 [cgroup]
root 14 0.0 0.0 0 0 ? S 12:19 0:00 [khelper]
root 15 0.0 0.0 0 0 ? S 12:19 0:00 [netns]
root 16 0.0 0.0 0 0 ? S 12:19 0:00 [async/mgr]
root 17 0.0 0.0 0 0 ? S 12:19 0:00 [pm]
root 18 0.0 0.0 0 0 ? S 12:19 0:00 [sync_supers]
root 19 0.0 0.0 0 0 ? S 12:19 0:00 [bdi-default]
root 20 0.0 0.0 0 0 ? S 12:19 0:00 [kintegrityd/0]
root 21 0.0 0.0 0 0 ? S 12:19 0:00 [kintegrityd/1]
若执行“ps -elf”命令,则将以长格式显示系统中的进程信息,并且显示内容较多。输出信息中还包括PPID列(表示对应进程的父进程的PID号)。
[[email protected] ~]# ps -elf
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
4 S root 1 0 0 80 0 - 4841 poll_s 12:19 ? 00:00:01 /sbin/init
1 S root 2 0 0 80 0 - 0 kthrea 12:19 ? 00:00:00 [kthreadd]
1 S root 3 2 0 -40 - - 0 migrat 12:19 ? 00:00:00 [migration/0]
1 S root 4 2 0 80 0 - 0 ksofti 12:19 ? 00:00:00 [ksoftirqd/0]
1 S root 5 2 0 -40 - - 0 cpu_st 12:19 ? 00:00:00 [migration/0]
5 S root 6 2 0 -40 - - 0 watchd 12:19 ? 00:00:00 [watchdog/0]
1 S root 7 2 0 -40 - - 0 migrat 12:19 ? 00:00:00 [migration/1]
1 S root 8 2 0 -40 - - 0 cpu_st 12:19 ? 00:00:00 [migration/1]
1 S root 9 2 0 80 0 - 0 ksofti 12:19 ? 00:00:00 [ksoftirqd/1]
5 S root 10 2 0 -40 - - 0 watchd 12:19 ? 00:00:00 [watchdog/1]
直接执行不带任何选项的ps命令时,将只显示当前用户会话中打开的进程。
[[email protected] ~]# ps
PID TTY TIME CMD
2258 pts/1 00:00:00 bash
2280 pts/1 00:00:00 bash
2369 pts/1 00:00:00 ps
由于系统中运行的进程数量较多。需要查询某一个进程的信息时可以结合管道操作和grep命令进行过滤。
[[email protected] ~]# ps aux | grep bash
root 2239 0.0 0.1 108336 1772 pts/0 Ss+ 12:22 0:00 /bin/bash
root 2258 0.0 0.1 108336 1812 pts/1 Ss 12:23 0:00 -bash
root 2280 0.0 0.1 108336 1764 pts/1 S 12:23 0:00 bash
root 2753 0.0 0.0 103256 848 pts/1 S+ 13:41 0:00 grep bash
2
top命令——查看进程动态信息
top命令将会在当前终端以全屏交互式的界面显示进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每三秒刷新一次。
上述输出信息中,开头的部分显示了系统任务Tasks、CPU占用、内存占用Mem、交换空间Swap等信息,下方将依次显示当前进程的排名情况。
-
系统任务Tasks信息:total:总进程数;running:正在运行的进程数;sleeping:休眠的进程数;stopped:中止的进程数;zomibe:僵死无响应的进程数。
-
CPU占用信息:us:用户占用;sy:内核占用;ni:优先级调度占用;id:空闲CPU;wa:I/O等待占用;hi:硬件中断占用;si:软件中断占用;st:虚拟化占用。Rt:实时变化。
-
内存占用Mem信息:total,总内存空间;used,已用内存;free,空闲内存;buffers,缓冲区域。
-
交换空间swap占用:total,总交换空间;used,已用交换空间;free,空闲交换空间;cached,缓存空间。
在top命令的全屏操作界面中,可以按P键根据CPU占用情况对进程列表进行排序,或按M键根据内存占用情况进行排序,按N键根据启动时间进行排序,按h键可以获得top程序的在线帮助信息,按q键可以正常退出top程序。
3
pgrep命令——查询进程信息
pgrep命令正是用来查询特定进程信息的专用工具。使用pgrep命令可以根据进程的名称、运行该进程的用户、进程所在的终端等多种属性查询特定进程的PID号。
通过pgrep命令,可以只指定进程的一部分名称进行查询,结合“-l”选项可同时输出对应的进程名、“-U”选项查询特定用户的进程、“-t”选项查询在特定终端运行的进程。
[[email protected] ~]# pgrep -l "log"
1180 rsyslogd
4
pstree命令——查询进程树
pstree命令可以输出Linux系统中各进程的树形结构,判断出各进程之间的相互关系(父、子进程)。pstree命令默认情况下只显示各进程的名称,“-p”选项使用时可以同时列出对应的PID号、“-u”选项可以列出对应的用户名、“-a”选项可以列出完整的命令信息。
执行“pstree -aup”命令可以查看当前系统的进程树,包括各进程对应的PID号、用户名、完整命令等信息。
[[email protected] ~]# pstree -aup
init,1
├─NetworkManager,1249 --pid-file=/var/run/NetworkManager/NetworkManager.pid
│ ├─dhclient,2909 -d -4 -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-eth1.pid -lf...
│ └─{NetworkManager},1300
├─abrtd,1570
├─acpid,1328
├─atd,1589
├─auditd,1155
│ └─{auditd},1156
├─automount,1411 --pid-file /var/run/autofs.pid
│ ├─{automount},1412
│ ├─{automount},1413
│ ├─{automount},1417
│ └─{automount},1420
├─bonobo-activati,1945 --ac-activate --ior-output-fd=18
│ └─{bonobo-activat},1946
├─certmonger,1601 -S -p /var/run/certmonger.pid
├─clock-applet,2192 --oaf-activate-iid=OAFIID:GNOME_ClockApplet_Factory --oaf-ior-fd=34
├─console-kit-dae,1672 --no-daemon
│ ├─{console-kit-da},1673
│ ├─{console-kit-da},1674
│ ├─{console-kit-da},1675
│ ├─{console-kit-da},1676
5
at一次性任务设置
at命令设置的计划任务只在指定的时间点执行一次,前提是对应的系统服务atd必须已经运行。需要注意的是,计划执行任务的时间、日期必须安排在当前系统的时刻之后,否则将无法正确设置计划任务。
设置一次性计划任务时,在at命令行中依次指定计划执行任务的时间、日期作为参数(若只指定时间则表示当天的该时间,若只指定日期则表示该日期的当前时间),确认后将进入带“at>”提示符的任务编辑界面,每行设置一条执行命令,可以依次设置多条语句,最后按Ctrl+D组合键提交任务即可。所设置的命令操作将在计划的时间点被依次执行。
[[email protected] ~]# date
2016年 06月 17日 星期五 15:01:40 CST
[[email protected] ~]# at 15:05 2016-06-17
at> cat /proc/cpuinfo > /tmp/ps.root
at> <EOT>
job 2 at 2016-06-17 15:05
[[email protected] ~]# cat /tmp/ps.root
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 61
model name : Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz
stepping : 4
cpu MHz : 2194.915
cache size : 3072 KB
fpu : yes
fpu_exception : yes
cpuid level : 20
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon xtopology tsc_reliable nonstop_tsc unfair_spinlock pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch arat fsgsbase smep
bogomips : 4389.83
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
processor : 1
vendor_id : GenuineIntel
cpu family : 6
model : 61
model name : Intel(R) Core(TM) i5-5200U CPU @ 2.20GHz
stepping : 4
cpu MHz : 2194.915
cache size : 3072 KB
fpu : yes
fpu_exception : yes
cpuid level : 20
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon xtopology tsc_reliable nonstop_tsc unfair_spinlock pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch arat fsgsbase smep
bogomips : 4389.83
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
You have mail in /var/spool/mail/root
[[email protected] ~]#
在当天的15:10时自动关闭当前系统。
[[email protected] ~]# at 15:10
at> cat /proc/cpuinfo
at> <EOT>
job 3 at 2016-06-17 15:10
[[email protected] ~]#
对于已经设置但还未执行的计划任务,可以通过atq命令进行查询。
[[email protected] ~]# atq
3 2016-06-17 15:10 a root
[[email protected] ~]#
若要删除指定编号的at任务,可以执行atrm命令。删除后的at任务将不会被执行,并且不会显示在atq命令的显示结果中。但已经执行过的任务无法删除。
[[email protected] ~]# at 15:16
at> cat /proc/cpuinfo
at> <EOT>
job 4 at 2016-06-17 15:16
[[email protected] ~]# atrm 4
[[email protected] ~]# atq
[[email protected] ~]#
6
crontab周期性任务设置
使用crontab命令设置的计划任务可以按预设的周期重复执行,可以大大减轻设置重复性系统管理任务的操作。启用周期性任务也有一个的前提条件,即对应的系统服务crond必须已经运行。
crontab的配置文件和目录
crond通过多个目录和文件设置计划任务,不同类型的任务由不同的配置文件来设置。
/etc/crontab文件中设置的是维护Linux系统所需的任务,由Linux系统及相关程序在安装时自动设置,不建议用户手动修改此文件。该文件包括了设置shell环境、可执行路径等变量的操作,以及每小时、每天、每周、每月需要执行的任务目录。
[[email protected] ~]# cat /etc/crontab
SHELL=/bin/bash 设置执行计划任务的shell环境
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
[[email protected] ~]#
/var/spool/cron——用户cron任务的配置文件存放目录
由用户自行设置的cron计划任务将被保存到目录/var/spool/cron/中,文件名与用户名相同。
[[email protected] ~]# ls -l /var/spool/cron/
总用量 0
[[email protected] ~]#
crond守护进程会自动检查/etc/crontab文件、/etc/cron.d/目录及/var/spool/cron目录中的改变,如果发现有配置更改,就会被载入内存,所以当某个crontab文件改变后并不需要重新启动crond守护进程就可以使设置生效。
使用crontab命令管理用户的计划任务
设置用户的周期性计划任务列表主要通过crontab命令进行,结合不同的选项可以完成不同的计划任务管理操作。
-e:编辑计划任务列表。
-u:指定所管理的计划任务属于哪个用户,默认时针对当前用户,一般只有root用户有权限使用此选项用户编辑、删除其他用户的计划任务。
-l:列表显示计划任务。
-r:删除计划任务列表。
当使用“*”时表示取值范围中的任意时间。crontab任务配置记录中所设置的命令操作将在“分钟”+“小时”+“日期”+“月份”+“星期”都满足的条件下执行。
crontab计划任务的配置格式 | |||||
分钟 | 小时 | 日期 | 月份 | 星期 | 执行的命令 |
01 | * | * | * | * | service httpd start |
02 | 4 | * | * | * | service httpd stop |
除了“*”以外,还可以用减号“-”、逗号“,”、斜杠“/”与数字构成表达式来表示较复杂的时间关系。
“-”:表示一个连续的时间范围
“,”:表示一个间隔的不连续范围
“/”:表示指定间隔频率,例如*/5表示每隔五天。
crontab计划任务的配置字段说明 | ||||
项目 | 说明 | |||
分钟 | 取值从0~59的任意整数 | |||
小时 | 取值从0~23的任意整数 | |||
日期 | 取值从1~31的任意整数(日期在该月份中必须有效) | |||
月份 | 取值从1~12的任意整数 | |||
星期 | 取值从0~7的任意整数,0或7代表星期日 | |||
命令 | 可以是普通的命令,也可以是编写的脚本 |
“crontab -e”命令:可以设置自己的计划任务。
[[email protected] ~]# crontab -e
01 * * * * /sbin/service httpd start
02 * * * * /sbin/service httpd stop
“crontab -l”命令:可以查看当前用户的计划任务列表。(-u:可以查看其它用户的计划任务)
[[email protected] ~]# crontab -l
01 * * * * /sbin/service httpd start
02 * * * * /sbin/service httpd stop
[[email protected] ~]#
“crontab -r”命令:可以删除用户的计划任务列表。
[[email protected] ~]# crontab -r
[[email protected] ~]# crontab -l
no crontab for root
[[email protected] ~]#