专栏首页星汉技术Linux基础之进程 原

Linux基础之进程 原

一、概述

1、什么是进程(Process)?

进程是程序的具体实现,执行程序的具体过程。

2、操作系统与进程

对比window系统进程,ctrl+alt+delete(看到的进程类似)。

操作系统的一个重要功能就是为进程提供方便,比如启动进程、为进程分配内存空间、管理进程的相关信息等等。

3、如何产生进程?

执行一个程序或命令就可以启动一个进程。进程启动时,操作系统为其分配相对应的系统内唯一的进程ID(PID)。

#Linux启动的第一个进程。
[root@localhost ~]# pidof init
1
#进程演示
[root@localhost ~]# ps a
vim install.log
#图像界面新开一个Terminal
#vim install.log

4、程序被加载为进程示意图

[root@localhost ~]# ps aux |grep bash
root      2491  0.0  0.1 108304  1920 pts/0    Ss   05:18   0:00 /bin/bash
root      2515  0.0  0.1 108304  1916 pts/1    Ss   05:20   0:00 -bash
root     25541  0.0  0.1 108340  1776 pts/2    Ss+  07:08   0:00 /bin/bash
root     25871  0.0  0.0 103252   828 pts/1    S+   08:04   0:00 grep bash
[root@localhost ~]# su - tom
[tom@localhost ~]$ ps aux | grep bash
root      2491  0.0  0.1 108304  1920 pts/0    Ss   05:18   0:00 /bin/bash
root      2515  0.0  0.1 108304  1916 pts/1    Ss   05:20   0:00 -bash
root     25541  0.0  0.1 108340  1776 pts/2    Ss+  07:08   0:00 /bin/bash
tom      25874  0.0  0.1 108340  1772 pts/1    S    08:04   0:00 -bash
tom      25895  0.0  0.0 103252   828 pts/1    S+   08:04   0:00 grep bash
[root@localhost ~]# service httpd start   #使用root身份启动httpd服务
[root@localhost ~]# ps aux |grep httpd   #查看httpd进程
root      2785  0.0  0.7 184288  3852 ?        Ss   07:39   0:00 /usr/sbin/httpd
apache    2788?        S    07:39   0:00 /usr/sbin/httpd 

以apache用户进行管理,达到安全机制,root身份启动后交给普通用户apache(apache用户无登录权限,防止他人恶意入侵后使用用户做一些操作)。 不同用户执行相同程序,注意其权限的不同。

[tom@localhost ~]$ ps au |grep vim
tom      26012  0.0  0.3 143572  3256 pts/2    S+   08:22   0:00 vim test
root     26013  0.0  0.3 143576  3268 pts/0    S+   08:22   0:00 vim abc

二、查看进程

1、ps

ps(process status) :将某个时间点的程序运作情况截取下来。

1.选项和参数 

-a:(all)(和输入终端(terminal)关联的所有process,通常与x一起使用,列出完整信息。

-x:后台进程,通常与a这个参数一起使用,可列出较完整信息。

-u:有效使用者(effective user)相关的process。

2.常用组合

ps -aux:观察系统所有的程序数据 (常用)!!!

ps axjf:可以用类似于树状的形式显示。

参数不用背,可以通过man ps或使用Linux的命令大全查看(推荐)。

示例:

#仅查看自己的bash相关的进程。
[root@localhost ~]# ps -l 
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
4 S     0  2305  2301  0  80   0 - 27084 wait   pts/0    00:00:00 bash
4 R     0  2357  2305  0  80   0 - 27035 -      pts/0    00:00:00 ps
#观察系统所有程序: ps aux(非常常用)
[root@localhost ~]# ps aux | head -4
USER  PID %CPU %MEM  VSZ   RSS TTY  STAT START   TIME COMMAND
root      1  0.1       0.1  19360  1540    ?        Ss   05:07   0:01 /sbin/init
root      2  0.0       0.0      0     0           ?        S    05:07   0:00 [kthreadd]
root      3  0.0       0.0      0     0           ?        S    05:07   0:00 [migration/0]

3.进程各选项的含义

USER:该process属于那个使用者。

PID:该process的程序标识符。 

%CPU:该process使用掉的 CPU 资源百分比。

%MEM:该process所占用的物理内存百分比。

VSZ:该process使用掉的虚拟内存量 (Kbytes)。

RSS:该process占用的物理的内存量 (Kbytes)。

TTY:该process是在哪个终端机上面运作,若与终端机无关则显示?,另外,tty1-tty6是本机上面的登入者程序,若为pts/0等等的,则表示为由网络连接进主机的程序。(pts表示虚拟终端,例如pts/1、pts/2等,如xshell连接)

STAT:该进程目前的状态,状态显示与ps -l的S旗标相同(R/S/D/T/Z)。 

START:该process被触发启动的时间。 

TIME:该process实际使用CPU运作的时间。 

COMMAND:该程序的实际命令是什么。  

4.进程状态

D:不可中断 Uninterruptible(usually IO)。

R:正在运行,或在队列中的进程。

S:处于休眠状态。

T :停止或被追踪。

Z:僵尸进程。僵尸进程(状态:Z )通常造成僵尸进程的原因是该进程应该已经执行完毕,或者是因故障应该要终止,但该进程的父进程却无法完整、有效的将进程结束掉,而造成进程一直存在内存当中。如果发现在某个进程的CMD后面,僵尸进程还接上<defunct>时,就代表该进程是僵尸进程。

例如:apache 8683 0.0 0.9 83384 9992 ? Z 14:33 0:00 /usr/sbin/httpd <defunct> 。

W:进入内存交换(从内核2.6开始无效)。

X:死掉的进程。

<:高优先级。

N:低优先级。

s:包含子进程。

+:位于后台的进程组。

2、top

top:动态观察进程的变化。

ps是截取一个时间点的进程状态,而top则可以持续观察进程运行的状态。

1.选项与参数

-d:后面可以接秒数,就是整个程序画面更新的秒数。默认5秒。

-b:以批次的方式执行top,还有更多的参数可以使用,通常会搭配数据流重导向,来将批次的结果输出成为档案。

-n:(Number)与-b搭配,意义是需要进行几次top的输出结果。

-p:指定某些个PID来进行观察监测而已。

#top -d 2
#top -b
#top -b -n 2
#top -b -n 5 > a.log
#cat a.log  

cat仅用于查看,不具备编辑功能,vim是可以编辑内容的,vim是vi编译器的升级版,可以理解为是一个强大的三方插件。

2.top执行过程中的按键指令

?:显示在top当中可以输入的按键指令。

P:以CPU的使用资源排序显示。

M:以Memory的使用资源排序显示。

N:以PID来排序。

T:由该Process使用的CPU时间累积(TIME+)排序。

k:给予某个PID后kill该进程(内核2.6后失效)。

q:离开top软件的按键。

#top –d 1

3.top中各选项的含义

按以上选项测试:

[root@localhost ~]#top -d 2 #每两秒钟更新一次 top
top - 05:06:55 up 13 min,  1 user,  load average: 0.00, 0.06, 0.10
Tasks: 125 total,   1 running, 124 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.0%sy,  0.0%ni, 99.5%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   1012352k total,   299596k used,   712756k free,    19276k buffers
Swap:  2031608k total,        0k used,  2031608k free,   108536k cached

第一行显示的信息:目前的时间,开机到目前为止所经过的时间up 13min,已经登入系统的用户人数1user,系统在1、5、15分钟的平均工作负载。

第二行显示的是目前进程的总量与个别进程在什么状态(running、sleeping、stopped、zombie)。

第三行显示CPU的整体负载。

第四行和第五行表示目前的物理内存与虚拟内存使用情况。

PID USER   PR  NI  VIRT  RES  SHR   S %CPU %MEM    TIME+  COMMAND            
 2301 root   20   0 15036 1244  956  R  0.5        0.1   0:00.50 top                
    1 root      20   0 19356 1540 1228 S  0.0        0.2   0:01.71 init               
    2 root      20   0     0    0         0      S  0.0        0.0   0:00.01 kthreadd           
    3 root      RT   0     0    0         0      S  0.0        0.0   0:00.04 migration/0        
    4 root      20   0     0    0         0     S   0.0        0.0   0:00.01 ksoftirqd/0        
    5 root      RT   0     0    0         0     S   0.0        0.0   0:00.00 migration/0        
    6 root      RT   0     0    0         0     S   0.0        0.0   0:00.00 watchdog/0         
    7 root      RT   0     0    0         0     S   0.0        0.0   0:00.11 migration/1 

每个process使用的资源情况:

PID:每个process的ID。

USER:该process所属的使用者。

PR:Priority的简写,程序的优先执行顺序,越小越早被执行。

NI:Nice的简写,与Priority(优先级)有关,也是越小越早被执行。

%CPU:CPU的使用率。

%MEM:内存的使用率。

TIME+:CPU使用时间的累加。

COMMAND:进程名称。

top默认使用CPU使用率(%CPU)作为排序的重点,如果想要使用内存使用率排序,则可以按下M,若要恢复则按下P即可。

#将top信息进行3次并输出到文件中:
[root@localhost ~]# top -b -n 3 > /tmp/top.txt
#查看top.txt文件
[root@localhost tmp]# cat top.txt

3、pstree

pstree查看进程树。

1.选项与参数

-A:各程序树之间的连接以ASCII字符来连接。

-U:各程序树之间的连接以万国码(UTF-8)的字符来连接。在某些终端接口下可能会有乱码。

-p:并同时列出每个process的PID。

-u:并同时列出每个process的所属账号名称。

系统进程树同时显示PID与user(root身份来执行,属于roo的程序不会显示)。

[root@localhost ~]# pstree -Aup  

三、进程管理kill

kill发送信号(并不只是杀进程)。

1、选项与参数

-l:这个是L的小写,列出目前kill能够使用的信号(signal)有哪些。

Signal:向进程发送的信号,指示其进行不同操作。用man 7 signal可知:

-15:以正常的程序方式终止一个进程!!!

-9:立刻强制终止一个进程!!!(!!不能强制结束系统级别的进程)

-2:代表由键盘输入 [ctrl]-c 同样的动作。

-1:对于sshd这样的守护进程,重新读取一次参数的配置文件(类似reload),如果进程为非守护进程,默认为终止进程!!

 [root@localhost ~]# kill –l   #所有可用的信号
1) SIGHUP   2) SIGINT  3) SIGQUIT   4) SIGILL   5) SIGTRAP 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1  11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM

具体含义可以通过man来查看。

[root@localhost ~]# man kill
SEE ALSO  bash(1), tcsh(1), kill(2), sigvec(2), signal(7)
[root@tedu ~]# man 7 signal

 Signal     Value     Action   Comment
 ------------------------------------------------------------SIGHUP        1      Term    Hangup detected on controlling terminal or death of controlling process
SIGINT        2       Term    Interrupt from keyboard
SIGKILL       9       Term    Kill signal
SIGTERM    15     Term    Termination signal

查看其中某个进程。

[root@localhost ~]# ps aux |grep sshd
root  1859  0.0  0.1  66604   1180 ?    Ss  04:55   0:00 /usr/sbin/sshd
root  2345  0.0  0.3  100348  4040 ?    Ss  05:21  0:00 sshd: root@pts/0 
root  2927  0.0  0.0  103256  832 pts/0  S+  07:10   0:00 grep sshd

重新加载并启动。

[root@localhost ~]# kill -1 1859
[ root@tedu ~]# ps aux |grep sshd
root  2345  0.0  0.3  100348  4040 ?    Ss   05:21   0:00 sshd: root@pts/0 
root  2928  0.0  0.1  66604  1144 ?    Ss   07:14   0:00 /usr/sbin/sshd
root  2930  0.0  0.0  103252  824 pts/0    S+   07:15   0:00 grep sshd

再次查看发现重启后的进程的pid发生了改变。

killall -signal 命令名:终止以某命令名称启动的全部进程。

向syslogd这个命令启动的进程发送一个SIGHUP信号

[root@localhost ~]# killall -9 syslogd

强制终止所有以httpd启动的进程

[root@localhost ~]# killall -9 httpd

可以使用hadoop(以java启动的进程)

[root@localhost ~]# jps  #查看hadoop的进程
[root@localhost ~]#ps aux|grep java
[root@localhost ~]#ps ax|grep datanode对应的PID
[root@localhost ~]#killall -15 java
[root@localhost ~]# jps #发现对应的进程已经全部关闭 (需要安装java后才能执行。)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux基础之网络 原

    eth(Ethernet的缩写)新安装的虚拟机为eth0,为什么原来的eth0会变成eth1?

    云飞扬
  • Linux基础之权限 原

    chmod [-cfRv][--help][--version][<权限范围>+/-/=<权限设置...>][文件或目录...]

    云飞扬
  • 原 荐 Centos 7+CDH5.7.2全

    云飞扬
  • Centos系统下Python版本升级

    这篇文章是之前写的在centos6下从python2.6升级到2.7的过程,升级到3.0以上版本的过程跟这个一样,懒得改了。 在使用Centos6时,由于系统自...

    py3study
  • linux下10条查看系统和硬件信息的命

    如果只想知道系统的名称,可以使用uname命令,而无需打印系统的相关的信息.或者使用uname -s命令将打印系统的内核名称.

    小柒吃地瓜
  • 在CentOS7中安装python3.7

    下载python3.7.0的安装包至/usr/local/src/目录,切换至/usr/local/src/目录:

    py3study
  • ansible ad-hoc

    定义主机清单 [root@ansible ~]# vim hosts[ceshii]192.168.6.141[docker]192.168.6.142 ...

    零月
  • 深入.NET数据类型(2)

    一.装箱和拆箱   将值类型转换为引用类型的过程称为装箱,反之称为拆箱 ? ?   实际开发尽量避免 装/拆 箱     原因:       装/拆 箱都会降低...

    房上的猫
  • Python 3 学习笔记:异常代码调试

    程序运行过程中,产生的错误统称为异常(bug)。这些异常有的可能是语法错误,如关键字输入错误、调用错误等,这一类的异常都是显式的,很好发现;还有一种就是隐式的错...

    py3study
  • 未读消息(小红点),前端与 RabbitMQ实时消息推送实践,贼简单~

    前几天粉丝群里有个小伙伴问过:web 页面的未读消息(小红点)怎么实现比较简单,刚好本周手头有类似的开发任务,索性就整理出来供小伙伴们参考,没准哪天就能用得上呢...

    程序员内点事

扫码关注云+社区

领取腾讯云代金券