> Linux教程 > Linux学习 >

Linux进程和计划任务

管理进程和计划任务
     本次依然介绍Linux系统管理基础部分,内容为Linux的引导过程和运行级别、管理进程和服务、设置任务的计划运行,和前面一样,只是简单介绍,深入的部分我也继续在学习,希望和大家共同学习,如有错误,请指点。
    一、Linux的引导流程
       1、系统启动的引导流程
    首先系统开机自检,然后是计算机开机后访问硬盘并读取首个扇区的MBR(即主引导目录),(备注:主引导扇区内部结构,其开头的446字节内容特指为“主引导记录”(MBR),其后是4个16字节的“磁盘分区表”(DPT),以及2字节的结束标志(55AA)。主引导扇区记录着硬盘本身的相关信息以及硬盘各个分区的大小及位置信息,是数据信息的重要入口。如果它受到破坏,硬盘上的基本数据结构信息将会丢失,需要用繁琐的方式试探性的重建数据结构信息后才可能重新访问原先的数据。)读取MBR记录后,这时进入系统选择界面,选择好某个操作系统后,则开始加载内核,接着从INIT进程获得系统控制权,即进入初始化过程,之后则读相应的配置文件,具体引导过程如下:
                     
       系统初始化进程及文件简单介绍
          1)、INIT进程与配置文件:
       INIT进程:由Linux内核加载运行/sbin/init程序,是系统中第一个进程,也是内核加载的第一个程序,PID(进程标识符)永远是1;配置文件是:/etc/inittab  

       INIT进程启动后会启动其它程序,生成新的进程,这些由init启动的进程称之为init进程的子进程,而init进程是这些进程的父进程
     2)、inittab文件结构:
      查看一下/etc/inittab配置文件的内容:
[itnetcn@localhost ~]# grep -v "^#" /etc/inittab | grep -v "^$" ==>查看这个文件时过滤掉注释行和空行
id:5:initdefault:
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
x:5:respawn:/etc/X11/prefdm -nodaemon
[itnetcn@localhost ~]# 
   各字段的含义:

  id
 
  用于在inittab文件中唯一标识一个配置记录
 
  runlevels
 
  用于指定该记录在哪些运行级别中运行
 
  action
 
  用于描述记录将执行哪种类型的动作
 
  process
 
  用于设置启动进程所执行的命令
 

id,也称标记字段,由1~4个字符组成,用以区别于其他行的配置,所以id标记字段必须是唯一的
runlevels,运行级别字段,用于指定该记录在哪些运行级别中运行,取值数字0~6,后面会对其进行详细解释
action ,动作类型字段,动作类型字段描述了该行配置所对应的操作类别,一般为固定值,较常用的类型如下:         initdefault:设置初始化系统后默认进入的运行级别
         sysinit:设置系统初始化的操作脚本
         wait:init进程将等待该行配置所对应的脚本操作完成后,再继续执行其他操作
         ctrlaltdel:设置当用户按下Ctrl+Alt+Delete组合键后的操作
        powerfail:设置当系统收到断电信号(使用不间断电源)时采取何种动作
        powerokwait:设置当系统收到恢复供电信号时采取何种动作
        respawn:一旦该行配置所对应的进程被终止,则重新启动该进程

process,程序或脚本字段,此字段用于指定该行配置所对应的实际操作,可以是具体的命令、脚本程序等    3)、其它系统初始化文件简介

/etc/rc.d/rc.sysinit
由init进程调用执行
完成设置网络、主机名、加载文件系统设置时钟等初始化工作(例如检查并启用磁盘配额功能就是在该脚本中完成的)。
/etc/rc.d/rc脚本文件
由init进程调用执行
rc脚本通过指定不同的级别参数分别加载及终止不同的系统服务,进入到相应的系统运行级别。
/etc/rc.local脚本文件
由rc脚本调用执行
rc.local脚本通常由rc脚本在最后进行加载,其作用主要是为管理员自行设置启动命令提供一种途径,通常都将一些需要随系统启动的命令和脚本添加到该文件中。(保存用户定义的需开机后自动执行的命令)
2、Linux系统的运行级别
1)、运行级别是指运行Linux系统的不同模式,每种模式对应不同的服务程序组合。
默认的7种运行级别
0:关机状态
1:单用户模式
2:字符界面的多用户模式(不支持网络)
3:字符界面的完整多用户模式
4:未分配使用
5:图形界面的多用户模式
6:重新启动
(解释:Linux系统在运行时,采用的每一种服务搭配称之为“运行级别”,运行级别类似于Windows系统中的正常启动、安全模式、带网络支持的安全模式……等概念,不同的运行级别使用了不同的服务程序组合,如“套餐”的概念,动感地带手机资费的10元短信套餐、15元音乐套餐)
2)、调整默认运行级别
修改/etc/inittab 文件中的 initdefault 配置,一般对于普通用户来说,runlevel设置为5,即为图像化操作,但是对于服务器来说,默认是设置为3,即字符界面,对于服务器来说,加载图形化界面是非常耗资源的,影响服务器性能。
[itnetcn@localhost ~]# vi /etc/inittab
进入之后有这样一行:
id:5:initdefault:    ==>这个5的意思就是设置开机后自动进入图形模式
3)、查看运行级别——runlevel
  runlevel:能显示切换前的运行级别和当前运行级别
  若临时切换运行级别,则使用init命令结合0-6的运行级别参数
[itnetcn@localhost ~]# runlevel   ==>查看当前运行级别
N 5   ==>第一个字符“N”表示之前未切换过运行级别
[itnetcn@localhost ~]# init 3   ==>将运行级别改为3
[itnetcn@localhost ~]# runlevel   ==>显示之前和改后的级别
5 3
[itnetcn@localhost ~]# init 6   ==>重启(这里我按了ctrl + C ,不然系统要重启了)
[itnetcn@localhost ~]# init 0   ==>系统关机
  3、系统服务的启动控制
  1)、查看系统服务的启动状态   chkconfig  --list  [服务名称]
  如查看network这个服务的启动状态,则使用:chkconfig --list  network
  2)、服务脚本位置:/etc/init.d  ——>  /etc/rc.d/init.d
  (/etc/init.d是一个符号链接,目标为 /etc/rc.d/init.d,通过这两个目录都可以找到系统服务对应的脚本文件)
  3)、设置系统服务的启动状态   chkconfig  --level  级别列表 服务名  on|off
  (解释:运行级别列表:可以是235、 35、5等等形式;服务名称:注意名称要正确,如果忘记了可查看/etc/init.d/目录下的脚本名 ;On|off: 启动或关闭启动状态)
  如设置network服务在2345级别下为启动状态:chkconfig  --level  2345  network  on
  再次查看它的服务时则可以看到network这个服务在各个模式下的启用状态
  4)、ntsysv系统服务管理工具——ntsysv  [--level  级别列表]
   此命令进入类似图形化的界面,可以集中对所有的系统服务进行设置
  
  使用和chkconfig命令和ntsysv命令跳转服务启动状态的对比说明:
  1)当需要设置个别服务在不同运行级别的启动状态时,选择使用chkconfig命令要更有效率
  2)当需要同时设置大量服务的启动状态时,选择使用ntsysv配置工具要更加适合
    二、进程管理
    1、程序与进程的区别
     程序:保存在硬盘、光盘等介质中的可执行代码和数据;是静态保存的代码

   进程:在CPU及内存中运行的程序代码; 是动态执行的代码; 
父、子进程:每个进程可以创建一个或多个进程    2、查看进程信息 
    1)、ps命令

    用途:查看静态的进程统计信息
    格式:ps aux   ==>显示系统所有进程                  ps -elf    ==>以长格式显示
    2)、top命令

        用途:查看动态的进程排名信息
       格式:top
   3)、pgrep命令  
    用途:根据特定条件查询进程PID信息    
[itnetcn@localhost ~]# pgrep "init"
1
[itnetcn@localhost ~]# pgrep -l "log"
2538 syslogd
2541 klogd
3221 login
[itnetcn@localhost ~]# pgrep -l -U teacher -t tty1
27483 bash
27584 vim
     4)、pstree命令

     用途:以树型结构显示各进程间的关系
   格式:pstree [-aup]
  3、进程的不同启动方式
   1)手工启动
    前台启动:用户输入命令直接执行程序
    后台启动:在命令行尾加入“&”符号(即把这个命令放在后台执行,执行后,会显示一个后台任务顺序号和一个PID号)
[itnetcn@localhost ~]# ls -l &
[1] 28453  ==>后台任务序号为1(这个要记住,因为唤醒时要用到),PID号为28453
   2)调度启动   
      使用at命令,设置在某个特定的时间,执行一次任务
  使用crontab命令,设置按固定的周期(如每天、每周等)重复执行预先计划好的任务
   3)、进程的前后台调度
  ctrl+Z   : 将当前进程挂起,即调入后台并停止执行
  jobs      :查看处于后台的任务列表
  fg        : 将处于后台的进程恢复到前台运行,需指定任务序号
 4)、终止进程的运行
  Ctrl + C :中断正在执行的命令
  kill、killall :  kill 用于终止指定PID号的进程
        killall 用于终止指定名称的所有进程
  -9选项用于强制终止
     下面是我使用top命令获取当前正在运行的进程(部分)
     
这里有两条top的进程,是因为我打开了两个terminal,然后都运行了top命令,若我现在要将另一个终端的top命令杀掉,则如下:
[itnetcn@localhost ~]# kill 3792 ==>此时另一个额终端将退出top命令
若杀掉所有正在打开的文本文件:killall -9 geidt
终止进程的运行——pkill命令
[jzhou@localhost ~]$ w | grep -v "root" ==>查看除root用户外哪些用户在使用终端
11:17:38 up  1:18,  3 users,  load average: 0.14, 0.05, 0.01
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
jzhou    :0       -                10:01   ?xdm?  18.56s  0.22s /usr/bin/gnome-
jzhou    pts/1    :0.0             11:17    0.00s  0.02s  0.01s w
jzhou    pts/2    :0.0             11:17   10.00s  0.01s  0.01s bash
[jzhou@localhost ~]$ 
上述pts有2个,是因为我打开了两个terminal,并且都是以jzhou用户登录的,现在我要停止pts/1里的所有进程:
[jzhou@localhost ~]$ pkill -9 -t pts/1    ==>这个命令一旦运行,则pts/1这个终端将立即关闭
再次查看时只有一个pts/2了:
[jzhou@localhost ~]$ w | grep -v "root" 
11:22:13 up  1:22,  2 users,  load average: 0.09, 0.12, 0.05
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
jzhou    :0       -                10:01   ?xdm?  18.56s  0.22s /usr/bin/gnome-
jzhou    pts/2    :0.0             11:17   00.00s  0.01s  0.00s w
[jzhou@localhost ~]$ 
   (我觉得这篇博文讲的也不错:http://blog.itnetcn.com/liyangbing315/article/details/4794708)
     三、计划任务管理
      1、at命令——   一次性任务设置

  在指定的日期、时间点自动执行预先设置的一些命令操作,属于一次性计划任务
  服务脚本名称:/etc/init.d/atd
  设置格式:at  [HH:MM]  [yyyy-mm-dd]
[itnetcn@localhost ~]# service atd start  ==>启动atd服务
[itnetcn@localhost ~]# at 11:35 
at> reboot
at>    ==>按ctrl + D 提交任务,则自动进入这里
job 1 at 2013-03-16 11:35
[itnetcn@localhost ~]# atq   
1       2013-03-16 11:35 a root
==>接下来我郁闷了好久,因为等了3分钟还没有结果,我是11:30分设置的这个计划任务,按道理早应该重启了,之后才发现,原来我虚拟机的时钟和我自己的电脑不同步,我自己的电脑快了5分钟,啊。。。白白等了N个3分钟还在不断找原因,执行了date命令才发现原来现在才11:30。。。
  2、crontab命令

  按照预先设置的时间周期(分钟、小时、天……)重复执行用户指定的命令操作,属于周期性计划任务
  (1)、先来看一下/etc/crontab文件的内容:
[itnetcn@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
  注意:
  启用周期性任务有一个前提条件,即对应的系统服务crond必须已经运行;
  全局配置和系统默认配置中的内容一般不需要用户去修改,用户只需设置/var/spool/cron/目录下与本帐号同名的文件即可

  (2)、管理cron计划任务
编辑计划任务:crontab  -e  [-u  用户名]
查看计划任务:crontab  -l  [-u  用户名]
删除计划任务:crontab  -r  [-u  用户名]
(root用户可以管理指定用户的计划任务;普通用户只能管理自己的计划任务)
(备注:用户只需执行“crontab -e”命令后会自动调用文本编辑器(默认为vi)并打开“/var/spool/cron/用户名”文件,无需手动指定文件位置)
    (3)、crontab应用简单举例
    1)、示例1:root用户
   需求:  每天早上7:50自动开启sshd服务,22点50时关闭
      每隔5天清空一次FTP服务器公共目录/var/ftp/pub
      每周六的7:30时,重新启动httpd服务
      每周一、三、五的17:30时,打包备份/etc/httpd目录
[itnetcn@localhost ~]# crontab -e
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)、示例2:jzhou用户

    需求:每周日晚上23:55时将“/etc/passwd”文件的内容复制到宿主目录中,保存为pwd.txt文件 
[itnetcn@localhost ~]# crontab -e -u jzhou 
55 23 * * 7  /bin/cp /etc/passwd /home/jzhou/pwd.txt 
      3)、示例3:

  root用户查看自己的计划任务列表;查看并删除jzhou用户设置的计划任务
[itnetcn@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

[itnetcn@localhost root]# crontab -l -u jzhou
55 23 * * 7  /bin/cp /etc/passwd /home/jzhou/pwd.txt
[itnetcn@localhost root]# crontab -r -u jzhou
[itnetcn@localhost root]# crontab -l -u jzhou
no crontab for jzhou
[itnetcn@localhost root]#
  
  从上面这3个例子简单总结一下crontab任务的配置格式:
   (1)  时间周期设置:                            任务内容设置:
    50       3      2       1     *       run_command

    分钟   小时   日期 月份   星期      命令

  字段
 
  说明
 
  分钟
 
  取值为从0到59之间的任意整数
 
  小时
 
  取值为从0到23之间的任意整数
 
  日期
 
  取值为从1到31之间的任意整数
 
  月份
 
  取值为从1到12之间的任意整数
 
  星期
 
  取值为从0到7之间的任意整数,0或7代表星期日
 
  命令
 
  要执行的命令或程序脚本
 
  
    前5个字段指定任务重复执行的时间规律,第6个字段用于指定具体的任务内容

crontab任务配置记录中,所设置的命令在“分钟+小时+日期+月份+星期”都满足的条件下才会运行。


  (2)、时间数值的特殊表示方法 
*     表示该范围内的任意时间
,    表示间隔的多个不连续时间点
-     表示一个连续的时间范围
/     指定间隔的时间频率
应用示例:
0  17  *  *  1-5          周一到周五每天17:00
30  8  *  *  1,3,5        每周一、三、五的8点30分
0  8-18/2  *  *  *       8点到18点之间每隔2小时
0  *  */3  *  *            每隔3天


(责任编辑:IT)