linux多任务概念:
    linux采用分时管理的方法,所有的任务都放在一个队列中,操作系统根据每个任务的优先级为每个任务分配合适的时间片,从而使所有的任务共同分享系统资源,因此linux可以在一个任务还未执行完成时,暂时挂起此任务,又去执行另一个任务,过一段时间以后再回来处理这个任务,直到这个任务完成,才从任务队列中去除,这个就是多任务的概念。
    进程:在自身的虚拟地址空间运行的一个独立的程序,从操作系统的角度来看,所有在系统上运行的东西,都可以称为一个进程。
    程序和进程的区别:进程由程序产生单并不是程序。程序是一个进程指令的结合。程序占用磁盘空间。进程占用内存空间,是动态,可变的,关闭进程,占用的内存资源随之释放。
    进程的分类:
        系统进程:可以执行内存资源分配和进程切换等管理工作,而且,该进程不受用户干预,(root也不可以)
                用ps -ef 查看 [] 包含的进程一般为系统进程。
        用户进程:通过执行用户程序,应用程序或内核之外的系统程序而产生的进程,用户控制。
         对于用户进程:分为交互进程,批处理进程和守护进程三类。
        1.交互进程:由一个shell终端启动的进程,需要与用户进行交互操作,可运行与前台或后台
        2.批处理进程:一个进程集合,负责按顺序启动其他的进程
        3.守护进程:一直运行着的进程,直到系统关闭。比如crond。还有开启的httpd进程。
    linux进程的几个状态
1. Linux进程状态:R (TASK_RUNNING),可执行状态&运行状态(在run_queue队列里的状态)
2. Linux进程状态:S (TASK_INTERRUPTIBLE),可中断的睡眠状态, 可处理signal
3. Linux进程状态:D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态, 可处理signal, 有延迟
4. Linux进程状态:T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态, 不可处理signal, 因为根本没有时间片运行代码
5. Linux进程状态:Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程。不可被kill, 即不响应任务信号, 无法用SIGKILL杀死
    进程之间的关系。
        在linux系统中,进程ID(用PID表示)是区分不同进程的唯一标识。它的大小有限最大ID32768,所有的进程都是PID为1的init进程的后代,内核在系统启动的最后阶段启动init进程。因此,这个进程时linux下所有及昵称的父进程,用PPID表示父进程。每个进程作为子进程都必须由父进程管理。当父进程停止,子进程也随之消失。僵死状态就是子进程结束。父进程没有释放系统资源。
    常用命令:
       1. ps -ef
        UID        PID  PPID  C STIME TTY          TIME CMD
        root         1     0  0 03:20 ?        00:00:01 /usr/lib/systemd/systemd
        其中,UID是用户的ID标识号,PID是进程的标识号,PPID表示父进程,STIME表示进程的启动时间,TTY表示进程所属的终端控制台,TIME表示进程启动后累计使用的CPU总时间,CMD表示正在执行的命令。
        # ps auxf
        USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
        root         2  0.0  0.0      0     0 ?        S    03:20   0:00 [kthreadd]
        其中,%CPU表示进程占用的CPU百分比,%MEM表示进程占用内存的百分比,VSZ表示进程虚拟大小,RSS表示进程的实际内存(驻留集)大小(单位是页)。STAT表示进程的状态,进程的状态有很多种:用“R”表示正在运行中的进程,用“S”表示处于休眠状态的进程,  用“Z”表示僵死进程,用“<”表示优先级高的进程,用“N”表示优先级较低的进程,用“s”表示父进程,用“+”表示位于后台的进程。START表示启动进程的时间。
    2. pstree 以树形结构显示程序和进程之间的关系。
        格式  :  pstree [-acnpu] [/]
        选项含义如下:
            -a 显示启动每个进程对应的完整指令,包括启动进程的路径,参数等等。
            -c 显示过程中包含子进程和父进程
            -n 根据进程PID来排序输出,默认以程序名称排序输出
            -p 显示进程PID
            -u 显示进程对应的用户名称
            PID  进程对应的PID 号
            user 系统用户名
    3.top
    4.lsof (list opened files) 列举系统中已经被打开的文件
        lsof filename 显示使用filename文件的进程
        lsof  -c  softname  显示 进程打开的文件数
            这个数字受系统限制  ulimit -a
        lsof  -p PID 根据进程号显示进程打开的文件
        lsof -i 通过监听指定的协议、端口、主机等信息,显示符合条件的进程信息。

    5.pgrep 通过程序名字来查询进程pid的工具
            参数:
                -l 此参数列出程序名和进程ID值
                -o 此参数用来显示进程起始ID值
                -n 此参数用来显示进程终止ID值
                -f  匹配command中的关键字 (如果想匹配mysqld  如果有-F 参数可以写成 my就可以找到mysqld)
                -G 此参数匹配指定组启动的进程相应的ID值。
    对比命令:查找进程的PID
        # ps -ef | grep mysqld| grep -v grep|awk '{print $2}'
        2713
        2858
        # pgrep mysql
        2713
        2858
    crond任务计划:
        主配置文件:/etc/crontab
    # 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
    minute: 表示分钟,可以是从0到59之间的任何整数。
    hour:表示小时,可以是从0到23之间的任何整数。
    day:表示日期,可以是从1到31之间的任何整数。
    month:表示月份,可以是从1到12之间的任何整数。
    week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
    command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
    在以上各个字段中,还可以使用以下特殊字符:
    星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
    逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
    中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
    正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
    crontab文件举例
    0 */5 * * * /usr/local/apache2/apachectl restart
    表示每隔5个小时重启apache服务一次。
     10 1 * * 6 /webdata/bin/backup.sh
    表示每周六的1点10分执行/webdata/bin/backup.sh脚本的操作。
     0 0 5,25 * *  fsck /dev/sdb8
    表示每个月的5号和25号检查/dev/sdb8磁盘设备。
     10 5 */5 * *  echo "">/usr/local/apache2/log/access_log
    表示每个月的5号、10号、15号、20号、25号、30号的5点10分执行清理apache日志操作。
    crond 注意事项
        1.注意环境变量
            指定crontab文件中指定任务运行所需的所有环境变量。脚本需要shell环境的支持。
        2.注意清理系统用户的邮件日志
            任务调度执行后,系统将输出信息通过电子邮件形式发送给当前系统用户。
            这里可以通过重定向忽略日志信息。
            > /dev/null 2>&1  (将正确的信息和错误的信息都重定向输出给/dev/null)
        3.系统级任务和用户级别的任务调度
            由于权限不同。一般需要root权限的调度需要指定root通过 crontab -uroot -e
            或crontab -e  直接写入。如果把一个系统级别的调度放入用户下将不生效。
    关闭进程:(kill 终止一个进程)kill的本质:就是将指定的信号送至程序。
        语法: kill [信号类型] 进程 PID
        查看系统所有的信号名称:
        kill -l| awk '{print $1$2,$3$4,$5$6,$7$8,$9$10}'|sed 's/ /\n/g'|grep -v "^$
        只有第9种信号(SIGKILL)才可以无条件终止进程,其他信号进程都有权利忽略,下面是常用的信号:
         HUP 1 终端断线
         INT 2 中断(同 Ctrl + C)
         QUIT 3 退出(同 Ctrl + \)
         KILL 9 强制终止
         用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。
          TERM 15 终止   shell的默认类型
         程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。
         CONT 18 继续(与STOP相反)
         STOP 19 暂停(同 Ctrl + Z)
         一般我们用到 ctrl + C 相当于给进程发送  kill -2 进程PID
                      ctrl + Z 相当于给进程发送  kill -19 进程PID
        kill -9 进程PID
        killall  进程名称