进程管理

概述

进程是应用程序的一个运行实例,即运行种的程序为进程
进程以进程发起者的身份运行
任何时候,用户操作计算机,就是在发起进程,因此进程是用户操作计算机的代理

进程分类:

     跟终端相关的进程:从终端启动的进程

     跟终端无关的进程:随系统一起启动的进程

查看进程

ps命令

ps命令参数格式:

  1.Unix风格:参数前加破折号 

      -e      显示所有进程

      -f       显示完整格式

      -l        长格式

     -o      指定输出字段,如:ps -o pid,comm,ni 

      -H      层级化显示(树状显示:父子进程相邻),可清楚看出进程启动顺序。

  2.BSD风格:参数前不加破则号

      #ps aux

           a:所有跟终端有关的进程

           u:显示进程的发起用户

           x:显示所有跟终端无关的进程

#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 - 4838 poll_s Jul01 ? 00:00:00 /sbin/init

字段解释:

F   内核分配给进程的系统标记

S   进程的状态

      0  睡眠

      S  休眠

      R  可运行,正等待运行

      T  停止

       Z  僵死(运行结束的进程不释放内存)

UID  进程属主

PID  进程ID

PPID 进程的父进程ID

C     进程声明周期中的CPU利用率

PRI   进程优先级(数值越大优先级越低)

NI   谦让度,用来参与决定优先级

ADDR  进程的内存地址

SZ 进程换出需要的交换空间

WCHAN  进程休眠的内存函数的地址

STIME  进程启动时的系统时间 

TTY    进程启动时的终端设备,非终端设备启动的进程显示?号

TIME  运行进程需要的累计CPU时间

CMD  进程名

      [进程名]:进程名外加[],表示该进程为内核线程

pstree  查看进程树

pidof 查看进程ID

pidof 进程名   

top  实时查看进程

top [option]

    -d:刷新时长

#top

top - 04:25:41 up 18:03, 2 users, load average: 0.00, 0.00, 0.00
Tasks: 73 total, 1 running, 72 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 502360k total, 378996k used, 123364k free, 46496k buffers
Swap: 1015800k total, 0k used, 1015800k free, 199956k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 19352 1560 1260 S 0.0 0.3 0:00.59 init

显示内容解释:

1.第1行

    系统当前时间、运行时间、登陆用户树

    up:系统运行时长

    load average:最近1min,5min,15min分钟的平均负载

2.第2行

   Tashks:任务数

3.第3行

   us:用户相关进程占用CPU百分比

   sy:系统相关进程占用CPU百分比

   ni:调整谦让度,影响CPU的比例

   id:CPU空闲百分比

   wa:等待I/O完成所占用的时间

   hi:硬件中断所占用的时间

   si:软中断所占用的时间

   st:被偷走的时间(虚拟化)

4.第4行、第5行:系统内存使用情况

5.第6行:

  VIRT:进程占用的虚拟内存总量

  RES:进程占用的物理内存总量

  %CPU:进程使用CPU的比例

  %MEM:进程使用的比例

 %TIME+:进程自启动到当前,使用CPU的时间总量

交互命令:

M 根据占用内存大小排序

P 根据CPU使用百分比排序

T 根据累计使用CPU时间排序

z 切换彩色模式还是单色模式

u 显示某个用户的进程

q 退出top

k 终止某个进程

备注:默认情况,top命令按CPU利用率排序

结束进程 

kill -l   #查看所有可执行的信号

kill PID     #向进程发送SIGTERM信号,终止进程(如果程序跑飞,将不能响应此信号)

kill -9 PID   #向进程发送SIGKILL,无条件终止进程

killall 进程名   #支持通配符

处理信号

进程之间通过信号来通信,常用linux进程信号如下:

信号    名称         描述

1        SIGHUP    挂起进程

2        SIGINT     终止进程

9       SIGKILL    无条件终止进程

15    SIGTERM  可能的话终止进程

18    SIGTSTP   暂停进程,不终止进程(下次启动时,可从上次执行的位置继续往下运行)

19    SIGCONT  继续运行停止的进程

 产生信号

ctrl+C:产生SIGINT信号,终止当前进程

ctrl+Z:产生SIGTSTP信号,暂停当前进程

#sleep 100

^Z      #键入Ctrl+Z命令

[1]+ Stopped   sleep 100    #1表示作页号

 捕捉信号

shell脚本默认忽略信号,将信号交给上层处理,可以使用trap命令捕捉信号,在本地处理。

trap commands signals

 捕捉普通信号

示例:检测到SIGINT或SIGTERM信号时不终止进程,而是打印一行信息

#cat trapsig.sh
#!/bin/bash
trap "echo 'Sorry I have traped Ctrl-C" SIGINT SIGTERM
echo "This is a test program"
sleep 100
#./trapsig.sh
This is a test program
^C    #输出Ctrl+C命令,产生一个SIGINT信号,结果打印如下,而不是终止进程
Sorry I have traped Ctrl-C

 捕捉脚本退出信号  trap  command EXIT

示例:捕捉脚本退出(EXIT),打印byebye

# cat test1
#!/bin/bash
trap "echo byebye" EXIT
echo This is a test program
count=1
while [ $count -le 5 ]
do
  echo "Loop #$count"
  sleep 2
  count=$[ $count + 1 ]
done
# ./test1
This is a test program
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
byebye 

 移除捕捉 trap -

cat test1
#!/bin/bash
trap "echo byebye" EXIT
echo This is a test program
count=1
while [ $count -le 5 ]
do
  echo "Loop #$count"
  sleep 2
  count=$[ $count + 1 ]
done
trap - EXIT
echo "I just removed the trap"
# ./test1
This is a test program
Loop #1
Loop #2
Loop #3
Loop #4
Loop #5
I just removed the trap

后台模式运行脚本

&

后台运行不影响前台操作,但仍然会使用显示器来显示STDOUT和STDERR信息

#[root@localhost home]#unt=1
while [ $count -le 5 ]
do
    sleep 2
    echo "Loop: $count"
    count=$[ $count + 1 ]
done
[root@localhost home]#./test.sh & [1] 5463 #1表示作业号,5463表示进程号

  [root@localhost home]# Loop: 1
Loop: 2
Loop: 3
Loop: 4
Loop: 5

[1]+ Done ./test.sh   #Done表示执行完成

非控制台方式运行脚本 nohup

默认情况下,每个后台终端进程都绑定了在绑定在某个终端中,如:pts/0,如果终端被关闭了,则后台进程也会退出

nohup命令会阻止所有发给该进程的SIGHUP信号,保证终端退出,后台进程不结束

nohup会把脚本输出结果,追加至当前目录下nohup.out文件中

1.运行上例的脚本

#nohup ./test1.sh &

2,退出并重登终端,待脚本运行结束后,查看nohup.out文件

#cat nohup.out

Loop: 1
Loop: 2
Loop: 3
Loop: 4
Loop: 5

 作业控制

linux将shell中运行的每个进程称为作业,并为每个作业分配一个唯一的作业号

1.查看作业

jobs 

  -l  列出进程ID及作业号

 -p  只列出作业的pid

 -r  只列出运行中的作业

 -s 只列出已停止的作业

 -n 只列出上次shell发出的通知后改变了状态的作业

#cat test.sh

sleep 100

#./test.sh

^Z    #ctrl+Z命令

[1]+  Stopped                 ./test.sh

#./test.sh

^Z  #ctrl+z命令

[2]+  Stopped                 ./test.sh

#./test.sh &

[3] 15631

#jobs -l

[1]- 15627 Stopped ./test.sh
[2]+ 15629 Stopped ./test.sh
[3] 15631  Running ./test.sh &

字段解释:

作业号

+ 表示默认作业,使用控制命令时,不指定作业号,默认操作此作业

- 当前默认作业完成时,带-号的作业会成为下一个默认作业

进程号:

作业状态:

      Stopped   #暂停的作业

      Running   #运行中

      Done   #作业变成Done,下次jobs查看将不存在

进程名:

2.重启作业

重启暂停的作业,从上次暂停的位置继续运行。

#bg [作业号]   #后台方式重启作业

#fg  [作业号]   #前台方式重启作业

2.终止作业

kill %作业号

调整谦让度

 同一时间,只有一个进程可以使用CPU,内核通过将CPU时间轮流分配给每个进程,实现多进程同时运行。

调度优先级是内核分配给进程的CPU时间总量,默认每个进程的调度优先级都相同,等于0

设置范围:-20~20,越小表示优先级越高,可使用CPU时间越多。

#nice -n -10 ./test1.sh   #调整调度优先级=-10

#renice -n 5 -p 6030  #修改进程号6030的调度优先级为5

备注:

    普通用户只能使用renice调整自己的进程的优先级,并且自能降低优先级

    root用户可以调整进程优先级到任何值

定时运行作业 at   

一次性

at命令会将作业提交到队列,指定shell何时运行该作业

at的守护进程atq会以后台模式运行,默认每60s检查/var/spool/at目录来获取提交的作业

at [-f filename]  time

   -q     #指定作业队列优先级,a的优先级最高

time:  

  at now +5 minutes  #5分钟后执行

  at now +5 hour    #5小时后

  at now +5 days  #5天后

  at now +5 weeks #5周后

  at 10:31am  #上午10:31
  at 10:31pm  #下午10:31
  at  10:31  2017-01-01  #2017-01-01 10:31

示例: 

#at  +5 minutes

>pwd

>  Ctrl+D    #ctrl+D结束命令输入

job 7 at 2017-07-02 08:46
# atq   #查看at任务
7 2017-07-02 08:46 a root

查看作业执行结果:/var/spool/mail邮箱

删除任务

#atrm 任务号

周期性任务 cron

前提:安装vixie-crom和crontabs软件包

服务名:crond

#crontab -e     #编辑任务

任务格式: 分 时 日 月 周 命令 

15 10 * * 6  pwd     #每周六的10:15分,执行pwd命令

15 10 * * * if [`date +%d -d tomorror` = 01 ]; then; /root/test.sh > stdout.file    #每月最后1天执行此脚本

15 10 * * 1~5  date  #周一至周五10:15分运行date命令

#crontab  -l   #查看任务

#cromtab -r  #删除所有任务

作业执行结果:在用户邮箱中,/var/spool/mail

周期性运行目录:

/etc/crom.hourly:此目录下的脚本,每小时运行一次

/etc/cron.daily :此目录下的脚本,每天运行一次

/etc/cron.weekly:此目录下的脚本,每周运行一次

/etc/cron.monthly:此目录下的脚本,每月运行一次

查看系统状态 vmstat

vmstat 3 10   #每个3s,显示10次

# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 12396 53788 283372 0 0 3 4 17 32 0 0 99 1 0

解释:

procs:进程相关

  r:运行队列长度

  b:阻塞队列长度

memory:内存相关

  swpd:已使用的交换内存大小

   free:空闲内存

  buff:缓冲空间大小

  cache:缓存空间大小

swap:交换分区相关

  si:多少页面从物理内存换出

  so:多少页面换入物理内存

io:I/O相关

  bi:多少磁盘块被调入到物理内存

  bo:多少磁盘块从内存中同步到磁盘

system:内核空间相关

  in:interrupt终端的个数

  cs:进程切换的次数

cpu:CPU利用率

  us:用户进程占用的CPU利用率

  sy:系统进程占用的CPU利用率

  id:cpu空闲利用率

  wa:等待I/O完成所占用的时间

  st:被偷走的时间

111
原文地址:https://www.cnblogs.com/zmdsg/p/7106099.html