一、什么是进程
1.作业和进程的概念
Linux是一个多用户多任务的操作系统。多用户是指多个用户可以在同一时间使用计算机系统;多任务是指Linux可以同时执行几个任务,它可以在还未执行完一个任务时又执行另一项任务。为了完成这些任务,系统上同时运行着多个进程,正在执行的一个或多个相关进程称为一个作业。
2.程序与进程的关系
程序
保存在硬盘、光盘等介质中的可执行代码和数据
是静态保存的代码
进程
在CPU及内存中运行的程序代码
是动态执行的代码
父、子进程:每个进程可以创建一个或多个进程
二、进程管理
1..查看进程信息
每当运行一个程序,都要启动一个进程。
ps命令
用途:显示正在执行的进程统计信息
格式:
常用:ps aux ps -elf
常用命令选项
a:显示当前终端下的所有进程信息
u:使用以用户为主的格式输出进程信息
x:显示当前用户在所有终端下的进程信息
-e:显示系统内的所有进程信息
-l:使用长格式显示进程信息
-f:使用完整的格式显示进程信息
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 2648 604 ? S Apr02 0:13 init [3]
root 2 0.0 0.0 0 0 ? SN Apr02 0:00 [ksoftirqd/0]
root 3 0.0 0.0 0 0 ? S< Apr02 0:19 [events/0]
root 4 0.0 0.0 0 0 ? S< Apr02 0:00 [khelper]
……
PID:该进程在系统中的数字ID号,在当前系统中是唯一的;
top命令
用途:查看动态的进程排名信息
[root@localhost ~]# top
top - 06:08:48 up 4 days, 6:57, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 60 total, 1 running, 59 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3% us, 0.7% sy, 0.0% ni, 97.4% id, 0.4% wa, 0.1% hi, 1.1% si
Mem: 191228k total, 171424k used, 19804k free, 19436k buffers
Swap: 265064k total, 1284k used, 263780k free, 120480k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6779 root 16 0 2536 832 668 R 3.8 0.4 0:00.04 top
1 root 16 0 2648 604 520 S 0.0 0.3 0:13.54 init
2 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/0
……
nice命令
是反映一个进程优先级状态的值,取值范围是-20至19,一共40个级别。
这个值越小,表示进程“优先级”越高,而值越大“优先级”越低。
renice命令
对一个正在运行的进程进行nice值的调整。
pgrep命令
用途:根据特定条件查询进程PID信息
常用命令选项:
-l:列出进程的名称
-U:根据进程所属的用户名进行查找
-t:根据进程所在的终端进行查找
[root@localhost ~]# pgrep "init"
1
[root@localhost ~]# pgrep -l "log"
2538 syslogd
2541 klogd
3221 login
[root@localhost ~]# pgrep -l -U teacher -t tty1
27483 bash
27584 vim
pstree命令
用途:以树型结构显示各进程间的关系
常用命令选项:
-p:列出进程的PID号
-u:列出进程对应的用户名
-a:列出进程对应的完整命令
2..前台、后台作业
作业可以在前台,也可以在后台运行,在同一时间只能有一个作业在前台运行。前台作业是指正对它进行交互操作的作业,它从键盘接受输入,并将输出送往屏幕。另一方面,后台作业不接受中断的输入。它们在运行时不需要交互操作,只是默默运行。
进程的前后台调度
Ctrl+Z组合键:将当前进程挂起,即调入后台并停止执行
jobs命令:查看处于后台的任务列表
fg命令:将处于后台的进程恢复到前台运行,需指定任务序号
[root@localhost ~]# jobs
[1]- Stopped cp /dev/cdrom mycd.iso
[2]+ Stopped top
[root@localhost ~]# fg 1
3..启动进程
在Linux系统中每个进程都具有一个进程号,用于系统识别和调度进程。启动一个进程有两个主要途径:手工启动和调度启动,后者是事先进行设置,根据用户要求自行启动。
手工运行
由用户输入命令,直接启动一个进程便是手工启动进程。但手工启动进程又可以分为很多种,根据启动的进程类型不同、性质不同,实际结果也不一样。前台启动是手工启动一个进程的最常用的方式。一般地,用户输入一个命令就已经启动了一个进程,而且是一个前台的进程。
输入yes命令如下:
$ yes
该命令将会打印出一连串的y。用户可以通过输入中断键(通常为Ctrl+C)来中断这个作业。在输入命令以后立即使用“ps”命令,可以查看进程状态。如果看不到进程状态,有可能是某些进程结束太快,使用“ps”查看时该进程已经执行结束了。上例中若希望yes命令继续运行下去,但同时也希望Shell提示符仍回到屏幕上去做其他的事情。这时可以将yes放到后台运行。这样,就能够在不需要任何交互操作的情况下使它继续运行了。
下面将yes的输出送给/dev/null,然后让这个作业在后台运行。将一个作业放到后台运行的一种方法是在命令后面加“&”字符,输入命令以后,出现一个数字,这个数字就是该进程的作业号和进程号,也称为PID。代码如下:
$yes > /dev/null &
[1] 164
这时,用户可以看到Shell的提示符又回到屏幕上,用户可以继续其他工作,
现在,yes进程正在后台运行,并不断把一连串y字符送给/dev/null。可使用jobs命令查看这个作业的状态,或者用ps命令来查看进程的状态
$ jobs
[1] + running yes > /dev/null &
调度启动
使用at命令,设置在某个特定的时间,执行一次任务
使用crontab命令,设置按固定的周期(如每天、每周等)重复执行预先计划好的任务
4.撤销作业
可以使用kill命令来撤销某个作业或终止某个进程。kill命令用作业号或PID作为参数来指定要撤销的作业。当使用作业号来标识作业时,在作业号前面要加“%”。若该作业的作业号为1,可用下面的命
$ kill %1
将会撤销这个作业。撤销了这个作业后,可以再用jobs命令来检查一下。
$ jobs
[1] + 已终止 yes > /dev/nu11
结果证实这个作业已经被撤销。如果再次使用jobs命令,屏幕上将不会显示任何信息。
还可以使用进程标识号(PID)来终止该进程在此,PID为164,所以命令:
$ kill 164
与命令:
$ kill %1
是等价的。
当使用进程标识号来指定作业时,进程标识号之前不加“%”。
Ctrl+C组合键:中断正在执行的命令
kill、killall命令:
kill用于终止指定PID号的进程
killall用于终止指定名称的所有进程
-9 选项用于强制终止
[root@localhost ~]# pgrep -l "portmap"
2869 portmap
[root@localhost ~]# kill -9 2869
[root@localhost ~]# killall -9 vim
[1]- 已杀死 /usr/bin/vim file1
[2]- 已杀死 /usr/bin/vim file2
pkill命令
用途:根据特定条件终止相应的进程
常用命令选项:
-U:根据进程所属的用户名终止相应进程
-t:根据进程所在的终端终止相应进程
[root@localhost ~]# w | grep -v "root"
14:10:10 up 6:08, 4 users, load average: 0.00, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
teacher tty1 - 14:04 5:34 0.16s 0.16s -bash
hackli pts/1 173.17.17.174 14:05 4:32 0.17s 0.17s -bash
[root@localhost ~]# pkill -9 -t pts/1
[root@localhost ~]# w | grep -v "root"
14:12:22 up 6:10, 3 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
teacher tty1 - 14:04 7:46 0.16s 0.16s -bash
5.中止作业和重新启动作业
还有另外一种方法用来将作业放到后台运行。首先正常地在前台启动一个作业,然后暂时中止它,最后在后台重新启动它。
例如在前台启动yes进程,命令如下:
$ yes > /dev/null
当然,由于yes是在前台运行的,用户不能在屏幕上看到Shell的提示符了。现在,将这个作业挂起,而不是将其用Ctrl+C中断。挂起一个作业将不会撤销这个作业,而只是将这个作业暂时中止了,直到用户重新启动它。
用户可以通过键入挂起键(Ctrl+Z)来挂起这个作业。
$ yes > /dev/null
ctrl+Z
[1] + stopped yes > /dev/null
当挂起一个作业后,它只是不运行了。这时,这个作业不占用CPU时间。用户可以重新启动这个作业,使这个作业重新运行,就像什么都没有发生过一样。作业将在被中止的地方继续执行。
使用fg命令,可以在前台重新启动一个作业。
$ fg
yes > /dev/nul1
Shell将把命令的名字重新显示到屏幕上,使用户知道目前哪个作业在前台执行。用户可以再次使用Ctrl+Z中止这个作业,改成用命令bg将这个作业放入后台执行。这时,命令将在后台运行,就像在上面用“&”来启动这个命令一样。
$ bg
[1] + yes > /dev/null &
如何再次中止这个作业呢?因为作业是在后台运行,使用Ctrl+Z已经没有什么用了。要中止该作业,首先应用fg命令将这个作业放到前台,然后再中止它。可用fg命令将已经中止的作业或后台运行的作业放到前台来运行。
后台作业和被中止的作业有很大的不同。被中止的作业没有运行,它不再使用CPU时间,并且它也不做任何工作。这个作业仍然占用系统的内存,但是这些内存可能被交换到硬盘上。而后台作业则是在运行、使用内存,并且与用户的其他作业同时进行的一些任务。如果一个后台作业有向显示终端的标准输出,那么该作业在运行时可能会向用户终端显示一些信息。这样的显示有时会干扰用户的前台作业。例如,如果用户使用命令:
$ yes &
而没有将输出的重定向到/dev/nul,y串会被显示到用户屏幕上。为了终止这无穷无尽的“y”,用户只能使用fg命令把作业放在前台,并使用Ctrl+C终止它的运行。
另外注意,fg和bg命令的缺省作业是最近被中止的作业。当用户用jobs命令列出时,作业号后面的“+”号表明该作业是最近被中止的作业。如果用户同时运行多个作业,fg或bg命令可以使用作业ID作为参数来指定作业放到前台还是后台。例如:
$ fg %2 #作业2被放到前台执行
$ fg %3 #作业3被放到前台执行
$ bg %4 #作业4被放到后台执行
在fg或bg命令中不能使用进程标识符。另外,使用单独的作业号也可以将作业放到前台。
6.作业的顺序执行
用户可以在一个命令行同时输入两个或更多的命令来使作业顺序执行。这时,作业之间用分号(;)或与号(&)分开。Linux系统将按照命令行的顺序来执行这些作业,并将所有的输出结果在屏幕上显示出来。
$ cd /;pwd;ls -F
该命令将顺序执行以下三个命令
1)cd /命令将使用户的工作目录变为根目录。
2)pwd命令显示当前工作目录的全路径
3)列出当前工作目录中的内容
进程的启动、中止、撤销与作业基本相同。
三、系统监视工具
1.桌面环境下监视系统
通过系统监视器可以实现对CPU、硬盘、内存和交换分区的实时监视
四、计划任务
1. at命令
在指定的日期、时间点自动执行预先设置的一些命令操作,属于一次性计划任务
服务脚本名称:/etc/init.d/atd
设置格式:at [HH:MM] [yyyy-mm-dd]
[root@localhost ~]# service atd start
启动 atd: [确定]
[root@localhost ~]# at 23:45
at> shutdown -h now
at> <EOT>
job 1 at 2009-09-14 23:45
[root@localhost ~]# atq
1 2009-09-14 23:45 a root
2.crontab命令
按照预先设置的时间周期(分钟、小时、天……)重复执行用户指定的命令操作,属于周期性计划任务
服务脚本名称:/etc/init.d/crond
主要设置文件:
全局配置文件,位于文件:/etc/crontab
系统默认的设置,位于目录:/etc/cron.*/
用户定义的设置,位于文件:/var/spool/cron/用户名
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
cron让使用者在固定时间执行指定的程序
cron调度与crond进程、crontab命令和crontab配置文件有关。
管理cron计划任务
编辑计划任务:crontab -e [-u 用户名]
查看计划任务:crontab -l [-u 用户名]
删除计划任务:crontab -r [-u 用户名]
crontab任务的配置格式
时间数值的特殊表示方法
* 表示该范围内的任意时间
, 表示间隔的多个不连续时间点
- 表示一个连续的时间范围
/ 指定间隔的时间频率
示例
0 17 * * 1-5 周一到周五每天17:00
30 8 * * 1,3,5 每周一、三、五的8点30分
0 8-18/2 * * * 8点到18点之间每隔2小时
0 * */3 * * 每隔3天
示例1(root用户):
每天早上7:50自动开启sshd服务,22点50时关闭
每隔5天清空一次FTP服务器公共目录/var/ftp/pub
每周六的7:30时,重新启动httpd服务
每周一、三、五的17:30时,打包备份/etc/httpd目录[root@localhost root]# crontab -l 50 7 * * * /sbin/service sshd start 50 22 * * * /sbin/service sshd stop 0 * */5 * * /bin/rm -rf /var/ftp/pub/* 30 7 * * 6 /sbin/service httpd restart 30 17 * * 1,3,5 /bin/tar jcvf httpdconf.tar.bz2 /etc/httpd
示例2(jerry用户):
每周日晚上23:55时将“/etc/passwd”文件的内容复制到宿主目录中,保存为pwd.txt文件
[root@localhost root]# crontab -l -u jerry 55 23 * * 7 /bin/cp /etc/passwd /home/jerry/pwd.txt [root@localhost root]# crontab -r -u jerry [root@localhost root]# crontab -l -u jerry no crontab for jerry