简单来说,每当执行一个程序或者命令,启动事件的时候都会得到一个PID,也就是进程ID。比如用户登陆的时候就会得到一个PID。如下所示。两个用户zhf和root在登陆后分别获得PID 3212和3214

root@zhf-linux:/home/zhf/zhf# ps -aux | grep 'bash'

zhf 3212 0.0 0.2 8968 4812 pts/5 Ss 08:36 0:00 bash

root 3224 0.0 0.1 6008 3600 pts/5 S 08:36 0:00 bash

前面我们还讲到了父子进程,比如在root这个账户下执行一些命令,那么root的PID 3224就是这些命令的父进程。用ps -l查看可以看到,ps命令的PID=4259. PPID=3224. PPID就父进程ID。

root@zhf-linux:/home/zhf/zhf# ps -l

F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4 S 0 3223 3212 0 80 0 - 2079 wait pts/5 00:00:00 su

4 S 0 3224 3223 0 80 0 - 1502 wait pts/5 00:00:00 bash

0 R 0 4259 3224 0 80 0 - 1869 - pts/5 00:00:00 ps

linux是多任务,多用户的系统。最直接的体现就是工作管理。什么是工作管理呢,比如我想ping一个网站,同时呢我又在做其他的事情,我不想ping网站的结果干扰我。那么我就可以把ping这个动作扔到后台去。前台继续做我的工作。前台就是你可以控制与执行命令的环境。后台就是自动运行的工作。那么如何将命令扔到后台去呢。只需要在命令的最后加一个
&就可以了。如下:

ping
-c 10 www.sina.com.cn &

执行完后会提示如下:

10
packets transmitted, 10 received, 0% packet loss, time 9012ms

rtt
min/avg/max/mdev = 27.893/28.957/31.411/1.237 ms

[1]+
Done ping -c 10 www.sina.com.cn

但是有一点不好的是,由于每秒都会进行一次ping操作,结果也会在终端上显示,这会干扰到我正在执行的动作。最简单的办法就是将就结果重定向到文件中去。如下所示,这样在前台界面就不会看到执行的结果了。

命令执行后会返回一个进程执行的pid。要查看在后台运行的程序可以通过jobs就可以看到后台执行的程序

root@zhf-linux:/home/zhf/zhf#
ping -c 10 www.sina.com.cn > test1.txt &

[1]
4437

root@zhf-linux:/home/zhf/zhf#
jobs

[1]+
Running ping -c 10 www.sina.com.cn > test1.txt &

root@zhf-linux:/home/zhf/zhf#
cat test1.txt

PING
www.sina.com.cn (218.30.66.248) 56(84) bytes of data.

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=1 ttl=54
time=31.1 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=2 ttl=54
time=30.6 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=3 ttl=54
time=29.8 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=4 ttl=54
time=32.0 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=5 ttl=54
time=28.4 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=6 ttl=54
time=29.3 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=7 ttl=54
time=28.1 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=8 ttl=54
time=30.5 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=9 ttl=54
time=28.6 ms

64
bytes from www.sina.com.cn (218.30.66.248): icmp_seq=10 ttl=54
time=33.8 ms

---
www.sina.com.cn ping statistics ---

10
packets transmitted, 10 received, 0% packet loss, time 9013ms

rtt
min/avg/max/mdev = 28.135/30.271/33.876/1.708 ms

[1]+
Done ping -c 10 www.sina.com.cn > test1.txt

但是如果此刻我正在用VIM,但是想退出去查找某个东西,那么是否需要退出VIM呢。当然不需要,我们只需要将VIM丢到后台去执行就可以了。按下ctrl+z就可以了。就想下面一样。

root@zhf-linux:/home/zhf/zhf#
vim test1.txt

[1]+
Stopped vim test1.txt

root@zhf-linux:/home/zhf/zhf#
jobs

[1]+
Stopped vim test1.txt

如果我想把后台的工作移到前台来,比如刚才的VIM操作,查找完毕继续编辑文档。这就要用到fg命令

fg
%jobnumber就可以将后台的工作任务移动到前台来,这个jobnumber就是用jobs结果的第一列的值。在这里VIM的jobnumber是1。执行fg
%1就可以回到VIM的界面
root@zhf-linux:/home/zhf/zhf#
fg %1

vim
test1.txt

前面在执行ctrl+z的时候看到后台的程序状态都是stopped.
表示后台程序已停止运行,那么如果我想让后台程序保持运行就要用到bg命令。比如查找一个文件,转到后台后状态是stopped。当执行bg
%1后,状态变为running。

root@zhf-linux:/home/zhf/zhf#
find / -name test1.txt

^Z

[1]+
Stopped find / -name test1.txt

root@zhf-linux:/home/zhf/zhf#
bg %1

[1]+
find / -name test1.txt &

root@zhf-linux:/home/zhf/zhf#
jobs

[1]+
Running find / -name test1.txt &

那如果我想将后台任务给删除掉呢,这就需要用到kill命令

root@zhf-linux:/home/zhf/zhf#
kill %1

root@zhf-linux:/home/zhf/zhf#
jobs

[1]+
Terminated find / -name test1.txt

进程的查看:

种方法:1
查看当前终端有关的进程 2
查看系统所有的进程

首先来看下查看当前终端有关的进程:ps
-l

root@zhf-linux:/home/zhf/zhf#
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4
S 0 3245 3233 0 80 0 - 2079 wait pts/2 00:00:00 su

4
S 0 3246 3245 0 80 0 - 1497 wait pts/2 00:00:00 bash

0
R 0 3266 3246 0 80 0 - 1869 - pts/2 00:00:00 ps

说明此进程的权限是root,若为1表示此子进程仅可进行复制fork,而无法执行

S:代表进程的状态。R
running S sleep D 不可唤醒 T
停止状态 Z
僵尸状态

UID/PID/PPID:分别是用户ID,进程PID,以及父进程PID

C代表CPU使用率,单位为百分比

PRI/NI:
priority和nice的缩写,代表进程的优先级,数值越小代表该进程越快被进程执行

ADDR/SZ/WCHAN:和内存有关,指进程在内存中的位置

TTY:登陆者的终端位置

TIME:CPU时间,实际耗费CPU的时间

CMD:进程的bash命令

系统所有的进程查看:
ps
aux

root@zhf-linux:/home/zhf/zhf#
ps aux

USER
PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root
1 0.1 0.2 24176 5228 ? Ss 08:39 0:02
/sbin/init spla

root
2 0.0 0.0 0 0 ? S 08:39 0:00
[kthreadd]

root
3 0.0 0.0 0 0 ? S 08:39 0:00
[ksoftirqd/0]

root
5 0.0 0.0 0 0 ? S< 08:39 0:00
[kworker/0:0H]

root
7 0.1 0.0 0 0 ? S 08:39 0:01
[rcu_sched]

root
8 0.0 0.0 0 0 ? S 08:39 0:00 [rcu_bh]

root
9 0.0 0.0 0 0 ? S 08:39 0:00
[migration/0]

root
10 0.0 0.0 0 0 ? S 08:39 0:00
[watchdog/0]

root
11 0.0 0.0 0 0 ? S 08:39 0:00
[watchdog/1]

这里只介绍前面没有的字段:

MEM:内存占用百分比

VSZ:使用的虚拟内存

RSS:固定占用的内存

上面看到的这些进程CPU或者内存百分比都是静态的,如果我们想查看动态的变化的话要使用top命令。

-d:
后面接秒数,就是进程的更新秒数,默认是5秒

-b:以批次的方式执行top,

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

-p:
指定某些PID来进行查看监控。

如果我想查看自己bash的进程变化情况:可以用下面的方法,首先查看当前进程的PID,
然后用-p
进程id的方式查看。

root@zhf-linux:/home/zhf/zhf#
echo $$

root@zhf-linux:/home/zhf/zhf#
top -d 2 -p 3246

进程的管理:

进程之间是可以相互控制的。比如我在运行某个进程的时候死机了,我可以启动另外一个终端查出死机的进程ID
并将进程杀死掉。这也是linux比windows维护起来方便的原因。进程之间通信需要用signal也就是信号来进行通知。

信号signal的值有下面几个:

1
SIGHUP 启动被终止的进程。

2
SIGNINT 相当于用键盘输入ctri-c来进行中断一个进程的进行

9
SIGKILL 代表强制中断一个进程的进行

15
SIGTERM 以正常的结束进程来终止该进程

17
SIGSTOP 相当于用键盘ctrl-z来暂停一个进程的进行。

进程之间传递进程采用kill命令。kill
-signal PID

就是我们当前使用的终端进程ID

zhf@zhf-linux:~$
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

0
S 1000 3620 3615 0 80 0 - 2242 wait pts/2 00:00:00 bash

0
R 1000 3644 3620 0 80 0 - 2305 - pts/2 00:00:00 ps

采用如下的命令
-9
强制中断当前的终端。执行后当前终端就会退出

zhf@zhf-linux:~$
kill -9 3620

进程的执行顺序:

在前面执行ps
-l的时候有两个参数priority和nice值。这两个值的作用在于调节进程的执行顺序。如果进程都是在一个队列里面进行,每个都按照顺序来,虽然很公平,但是会带来一个问题,比如有3个进程,进程1是紧急的进程,进程2和3是一般的进程而且进程2和进程3的工作很耗时间。如果按照顺序来,紧急的进程1就有可能半天得不到调度。紧急的任务就一直卡在那里。为了解决这个问题,引入了进程的优先级参数,也据是priority和nice值。PRI越低就代表越优先的意思。那么nice值是起什么作用的呢。

因为PRI是内核动态调整的,我们是无法去修改的。如果要调整进程的优先级,只能通过nice值来进行调整。PRI(new)=PRI(old)+nice。当nice为负值的时候,就是降低PRI值,优先级就会提高。反之则是降低

nice值的可调整范围是-20-19

比如我们新增一个vi进程并转入后台处理,设置nice值为-5。
通过ps
-l可以看到vi进程的nice值。原本BASH内置的PRI值为80,
nice设为-5以后,PRI变为75

root@zhf-linux:/home/zhf#
nice -n -5 vi &

[1]
3802

root@zhf-linux:/home/zhf#
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4
S 0 3681 3670 0 80 0 - 2079 wait pts/2 00:00:00 su

4
S 0 3682 3681 0 80 0 - 1497 wait pts/2 00:00:00 bash

4
T 0 3802 3682 2 75 -5 - 3634 signal pts/2 00:00:00 vi

0
R 0 3803 3682 0 80 0 - 1869 - pts/2 00:00:00 ps

已有的进程可以通过renice的方法进行调整。下面的就是将su进程的nice调整为-5

root@zhf-linux:/home/zhf#
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4
S 0 3681 3670 0 80 0 - 2079 wait pts/2 00:00:00 su

4
S 0 3682 3681 0 80 0 - 1500 wait pts/2 00:00:00 bash

0
R 0 3817 3682 0 80 0 - 1869 - pts/2 00:00:00 ps

root@zhf-linux:/home/zhf#
renice -5 3681

3681
(process ID) old priority 0, new priority -5

root@zhf-linux:/home/zhf#
ps -l

F
S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD

4
S 0 3681 3670 0 75 -5 - 2079 wait pts/2 00:00:00 su

4
S 0 3682 3681 0 80 0 - 1500 wait pts/2 00:00:00 bash

0
R 0 3823 3682 0 80 0 - 1869 - pts/2 00:00:00 ps

一起来学linux:进程的更多相关文章

  1. 十天学Linux内核之第二天---进程

    原文:十天学Linux内核之第二天---进程 都说这个主题不错,连我自己都觉得有点过大了,不过我想我还是得坚持下去,努力在有限的时间里学习到Linux内核的奥秘,也希望大家多指点,让我更有进步.今天讲 ...

  2. 跟着鸟哥学Linux系列笔记3-第11章BASH学习

    跟着鸟哥学Linux系列笔记0-扫盲之概念 跟着鸟哥学Linux系列笔记0-如何解决问题 跟着鸟哥学Linux系列笔记1 跟着鸟哥学Linux系列笔记2-第10章VIM学习 认识与学习bash 1. ...

  3. 为学Linux,我看了这些书

    为学Linux,我看了这些书   去年开始,抱着学习的态度开始了我的Linux学习,到现在,差不多一年了,收获很多,不敢说精通Linux,但是,还是对得起"略懂"这两个字的.这一年 ...

  4. 十天学Linux内核之第八天---构建Linux内核

    原文:十天学Linux内核之第八天---构建Linux内核 今天是腊八节,说好的女票要给我做的腊八粥就这样泡汤了,好伤心,好心酸呀,看来代码写久了真的是惹人烦滴,所以告诫各位技术男敲醒警钟,不要想我看 ...

  5. 十天学Linux内核之第七天---电源开和关时都发生了什么

    原文:十天学Linux内核之第七天---电源开和关时都发生了什么 说实话感觉自己快写不下去了,其一是有些勉强跟不上来,其二是感觉自己越写越差,刚开始可能是新鲜感以及很多读者的鼓励,现在就是想快点完成自 ...

  6. 十天学Linux内核之第六天---调度和内核同步

    原文:十天学Linux内核之第六天---调度和内核同步 心情大好,昨晚我们实验室老大和我们聊了好久,作为已经在实验室待了快两年的大三工科男来说,老师让我们不要成为那种技术狗,代码工,说多了都是泪啊,, ...

  7. 十天学Linux内核之第五天---有关Linux文件系统实现的问题

    原文:十天学Linux内核之第五天---有关Linux文件系统实现的问题 有时间睡懒觉了,却还是五点多醒了,不过一直躺倒九点多才算起来,昨晚一直在弄飞凌的嵌入式开发板,有些问题没解决,自己电脑系统的问 ...

  8. 十天学Linux内核之第四天---如何处理输入输出操作

    原文:十天学Linux内核之第四天---如何处理输入输出操作 真的是悲喜交加呀,本来这个寒假早上8点都去练车,两个小时之后再来实验室陪伴Linux内核,但是今天教练说没名额考试了,好纠结,不过想想就可 ...

  9. 十天学Linux内核之第三天---内存管理方式

    原文:十天学Linux内核之第三天---内存管理方式 昨天分析的进程的代码让自己还在头昏目眩,脑子中这几天都是关于Linux内核的,对于自己出现的一些问题我会继续改正,希望和大家好好分享,共同进步.今 ...

  10. 十天学Linux内核之第一天---内核探索工具类

    原文:十天学Linux内核之第一天---内核探索工具类 寒假闲下来了,可以尽情的做自己喜欢的事情,专心待在实验室里燥起来了,因为大二的时候接触过Linux,只是关于内核方面确实是不好懂,所以十天的时间 ...

随机推荐

  1. GCJ——Minimum Scalar Product(2008 Round1 AA)

    题意: 给定两组各n个数,可任意调整同一组数之中数字的顺序,求 sum xi*yi i=1..n的最小值. Small: n<=8 abs xy,yi<=1000 Large: n< ...

  2. SQLServer出现不允许保存更改的问题解决

    如图所示: 解决方法: [工具]->[选项]

  3. vs2010下如何调试带输入参数的程序

    当main函数的输入参数为空时,我们可以很方便的通过设置断点,单步运行的方法调试,可是如果需要调试的是有输入参数的程序该怎么办呢?最终还是让我找到了: 英文版:Project -> Proper ...

  4. 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)

    AvalonDock 是一个.NET库,用于在停靠模式布局(docking)中排列一系列WPF/WinForm控件.最新发布的版本原生支持MVVM框架.Aero Snap特效并具有更好的性能. Ava ...

  5. iOS 给三方日历加上农历

    首先创建一个农历文件 LunarCalendar.h // // LunarCalendar.h // Hnair4iPhone // // Created by yingkong1987 on 13 ...

  6. go --socket通讯(TCP服务端与客户端的实现)

    这篇文章主要使用Go语言实现一个简单的TCP服务器和客户端.服务器和客户端之间的协议是 ECHO, 这个RFC 862定义的一个简单协议.为什么说这个协议很简单呢, 这是因为服务器只需把收到的客户端的 ...

  7. HDU 1041 Computer Transformation 数学DP题解

    本题假设编程是使用DP思想直接打表就能够了. 假设是找规律就须要数学思维了. 规律就是看这些连续的0是从哪里来的. 我找到的规律是:1经过两次裂变之后就会产生一个00: 00经过两次裂变之后也会产生新 ...

  8. Python--图像处理(2)

    skimage提供了io模块,顾名思义,这个模块是用来图片输入输出操作的.为了方便练习,也提供一个data模块,里面嵌套了一些示例图片,我们可以直接使用. 引入skimage模块可用: 1 from  ...

  9. 转: 微信开源C/C++ RPC框架PhxRPC

    转自: http://mp.weixin.qq.com/s?__biz=MzI4NDMyNTU2Mw==&mid=2247483734&idx=1&sn=da364812eca ...

  10. leetcode笔记:Ugly Number II

    一. 题目描写叙述 Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prim ...