一:进程和线程

1:内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、 安全功能等
2:Process: 运行中的程序的一个副本,是被载入内存的一个指令集合,而且可以载入内存多个。(下图解释进程的执行过程)

进程_计划安排

从上图可以看出程序的执行必须要从硬盘调到内存中,成为进程,才能执行。而且硬盘中相同的程序可以在在内存中运行多分。在内存中,每个进程会得到一个号码,,也就是进程ID(PID),用来标记各个进程。

3:UIDGID、和SELinux语境决定对文件系统的存取和访问权限,通常从执行进程的用户来继承存在生命周期
4:task structLinux内核存储进程信息的数据结构格式
5:task list:多个任务的的task struct组成的链表
6:进程创建
init:第一个进程其他进程都是他的子进程。
进程:都由其父进程创建,
CoW,fork(), clone()

7:线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。

8:线程与进程的区别可以归纳为以下4点:

1)地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

2)通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

3)调度和切换:线程上下文切换比进程上下文切换要快得多。

4)在多线程OS中,进程不是一个可执行的实体。


二:进程优先级

1:进程优先级:每个进程都有相应的优先级,优先级决定它何时运行和接收多少 CPU 时间系统优先级: 数字越小,优先级越高。
2:nice值:我
们都知它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别。这个值越小,表示进程”优先级”越高,而值越大“优先级”越低

3:priority值:就是ps命令中看到的PRI值或者top命令中看到的PR值。

4:实时进程/非实时进程

内核在设计的时候,将实时进程单独映射了100个优先级,这些优先级都要高与正常进程的优先级(nice值),它们的主要区别就是通过优先级来区分的。所有优先级值在0-99范围内的,都是实时进程,所以这个优先级范围也可以叫做实时进程优先级,而100-139范围内的是非实时进程。

5:设置nice值

     renice -n # (-20~19) pid
     nice -n #(-20~19) -# command

进程_at_02

6:查看nice值
        ps axo ni[ce]

进程_cron_03


三:进程管理常用命令

1:ps(ps有两种方式)
(1)BSD方式
       a 所有用户在所有终端上运行的前台进程
       x 当前用户运行的所有进程(包括前台进程和后台daemon)
       ax 所有用户运行的所有进程
       aux 所有用户运行的所有进程,结果中显示用户名
       f 显示父子进程关系

进程_at_04       -C 用进程名进行过滤

进程_at_05
       axo配合
           o 自定义输出列
               %cpu
               %mem
               pid
               uid
               gid
               cmd
               comm
               tty  显示终端名,如为?,表示daemon后台进程
               ruser 命令的发起人
               euser 命令的真正执行人
               state
       k 排序或--sort

进程_cron_06
UNIX方式
    -e 显示所有进程
    -f 显示完整格式
    -ef 以完整格式显示所有进程
    -eF 以更完整格式显示所有进程
    -efH 显示父子进程关系

进程_at_07

        -eo 自定义显示结果,如下
             ps -eo %cpu,%mem,pid,nice,pri,stat,comm
进程_cron_08
  
2:pgrep
    -u  UID/USERNAME 基于执行程序的用户名进行搜索
    -l  显示的结果中增加进程名
    -t  终端名
    -P  查看子进程

进程_计划安排_09

进程_cron_10

进程_计划安排_11

3:pidof 进程名   查询对应进程名的PID
进程_cron_12

4:uptime :显示当前时间,系统已启动的时间、当前上线人数,系统平均负载
进程_at_13top
5:vmstat:显示虚拟内存信息

    r:可运行
    b:处于不可中断睡眠状态的进程个数

    swpd:当前虚拟内存的已使用空间
    free:物理内存的剩余空间,直致不够用时,才会使用虚拟内存

    buffer:用于buffer的内存总量
    cache:用于cache的内存总量

    si:表示内存从swap读入的总量
    so:表示从内存写出到swap的总量

    bi:表示内存从硬盘读入的总量
    bo:表示从内存写出到硬盘的总量

    in:每秒中断的速率
    cs:进程切换速率

    us:用户空间时间
    sy:内核空间,系统空间
    id:空闲时间
    wa:等待时间
    st:被虚拟机偷走的时间
进程_at_14    vmstat -s 详细查看内存信息
进程_计划安排_15
   6: iostat:统计CPU和设备IO信息
进程_计划安排_16
 7:pmap:进程对应的内存映射

        pmap pid
        pmap -x pid
进程_cron_17
     ls -l /proc/40052/fd |wc -l
         通过查看进程文件描述符的数量是否增长来判断是否有内存泄露的问题

8:kill
    -0 无作为,可以用来单纯判断进程是否运行.
    -1 -HUP:强制进程重读配置文件
    -2 -INT: 中止正在运行的进程;相当于Ctrl+c
    -3 -QUIT: 相当于ctrl+\
    -9 -KILL: 强制杀死正在运行的进程
    -15 -TERM: 终止正在运行的进程 (默认)\

killall 

    进程名

进程_at_18

进程_at_19

pkill
    -u 用户名  杀死指定用户所运行的所有进程
    pkill -t pts/1  杀死指定终端上运行的所有进程
进程_at_20

进程_cron_21


四:进程的前后台
1:常用命令:
    ctrl+z 将运行在前台的进程暂停  或 kill -19 PID
    bg 将在当前终端上暂停的进程,放入后台继续运行  或kill -18 PID
    fg 将在当前终端上暂停的或在当前终端上后台运行的进行,放入前台继续运行

进程_at_22

2:使进程不再依附于终端在后台运行
    nohup command &> /dev/null
    screen; command
    (command&)
进程_计划安排_23

(1):用第一种方法后,我们可以看到,当关闭终端后,该进程依然存在。进程_cron_24

(2):用第二种方法可以发现,关闭终端后,该进程依然存在,且依赖于screen进程,加入screen后发现进程还在执行。

进程_at_25

进程_计划安排_26

(3):用第三种办法,也可以达到效果。

进程_cron_27

进程_计划安排_28

3:并行运行多条命令

(1)将多个脚本写在一个脚本里面。

    vim all.sh
        sh1&
        sh2&
        shn&
(2)直接在命令行里输入如下命令。
    (sh1&);(sh2&)
进程_at_29

(3):在命令行输入如下命令

    {sh1&sh2&sh3}


五:任务计划

1:at

(1)at hh:mm
        atq 或 at -l 列出指定队列中等待运行的作业
        at -c 队列序号  查看指定序号队列的详细信息
        atrm 队列序号 或 at -d 队列序号 删除指定序号的队列

进程_计划安排_30

进程_at_31

(2)at的其他设置方式

        echo wall 123 |at 20:00


        [root@centos7 ~]# at 20:00 << EOF
        > wall hello
        > wall 123
        > wall nihao
        > EOF


        at 20:00 -f at.txt

进程_cron_32

注意:之前我们一直在讲at的设置,那有没有想过这些at十一is很么方式存在的呢?接下来我们来看一下,到/var/spool /at 目录下我们可以发现以下文件,这就是at文件,他们保存在了硬盘中,也就是说开机后这些未执行的操作依然有效。

at在指定时间时,如果还没过,就表示当天,如果过了,它会自动理解为下一天。

进程_at_33

(3):at计划结果的查看

对于一些有输出结果的计划,我们要怎样查看它的输出呢?我们可以通过邮件来查看,系统会自动将结果以邮件的形式发送给我们。

进程_计划安排_34

(4)at的任务是否能运行依赖于atd服务

        centos6: service atd start
        centos7: systemctl start atd
(5)限制用户不能使用at配置计划任务
        当仅/etc/at.deny 存在时(默认)写入deny的用户不能配置at
        当/etc/at.allow存在时/etc/at.deny失效,只有写在allow中的用户才能配置at
        当/etc/at.allow及/etc/at.deny都不存在时,仅有root才能配置at


2:cron
    (1)/etc/crontab 系统级计划任务
        56 10 * * * root /app/backup 仅能通过 root定义,不过可以以普通用户的身份去执行计划任务中的命令。(可以用普通用户的身份执行,但不能定义计划任务)

进程_cron_35

    日志/var/log/crond
进程_at_36

(2)特殊的日期表达方式
    @reboot        Run once after reboot. 当下次启动计算机时,启动到crond服务时运行该计划。
    @yearly        0 0 1 1 *
    @annually        0 0 1 1 *
    @monthly        0 0 1 * *
    @weekly        0 0 * * 0
    @daily        0 0 * * *
    @hourly        0 * * * *

centos7:
    1.grub : linux16   最后加上空格rd.break    按Ctrl + x
    2.mount -o remount,rw /sysroot
    3.vi /sysroot/etc/crontab

进程_at_37

进程_计划安排_38

进程_计划安排_39

centos6:
    1.grub : kernel 最后加空格1 先Esc加到主界面 再b启动
    2.vim /etc/crontab

进程_cron_40

进程_cron_41

进程_cron_42


/etc/crontab 是系统级计划任务的主配置文件
    -->  /etc/cron.d 是系统级计划任务的扩展配置文件,其中的所有都应该是按crond的格式编写,每一个文件都会生效
        --> /etc/cron.d/0hourly  
            01 * * * * root run-parts /etc/cron.hourly 又用run-parts命令,扩展到了/etc/cron.hourly目录,其中的所有脚本均会在每小时的01分执行

(3)crontab
    crontab -e [-u username]
    crontab -l
    crontab -r 直接该用户的crontab文件,故所有计划全删除,如只需删除某条,直接-e删除该行即可。
    crontab -i -r 功能同上,在删除前寻问



(4)限制用户不能使用crontab配置计划任务
    当仅/etc/cron.deny 存在时(默认)写入deny的用户不能配置crontab
    当/etc/cron.allow存在时/etc/cron.deny失效,只有写在allow中的用户才能配置crontab
    当/etc/cron.allow及/etc/cron.deny都不存在时,仅有root才能配置crontab