标签 进程 下的文章

执行中的程序在称作进程。当程序以可执行文件存放在存储中,并且运行的时候,每个进程会被动态得分配系统资源、内存、安全属性和与之相关的状态。可以有多个进程关联到同一个程序,并同时执行不会互相干扰。操作系统会有效地管理和追踪所有运行着的进程。

为了管理这些进程,用户应该能够:

  • 查看所有运行中的进程
  • 查看进程消耗资源
  • 定位个别进程并且对其执行指定操作
  • 改变进程的优先级
  • 杀死指定进程
  • 限制进程可用的系统资源等

Linux提供了许多命令来让用户来高效掌控上述的操作。接下来,一个一个的来讲解下。

1. ps

'ps'是Linux 中最基础的浏览系统中的进程的命令。能列出系统中运行的进程,包括进程号、命令、CPU使用量、内存使用量等。下述选项可以得到更多有用的消息。

ps -a - 列出所有运行中/激活进程

Output of "ps -a" command

ps -ef |grep - 列出需要进程
ps -aux - 显示进程信息,包括无终端的(x)和针对用户(u)的进程:如USER, PID, %CPU, %MEM等

2. pstree

linux中,每一个进程都是由其父进程创建的。此命令以可视化方式显示进程,通过显示进程的树状图来展示进程间关系。如果指定了pid了,那么树的根是该pid,不然将会是init(pid: 1)。

pstree

3. top

‘top’是一个更加有用的命令,可以监视系统中不同的进程所使用的资源。它提供实时的系统状态信息。显示进程的数据包括 PID、进程属主、优先级、%CPU、%memory等。可以使用这些显示指示出资源使用量。

top

4. htop

htop与top很类似,但是htop是交互式的文本模式的进程查看器。它通过文字图形化地显示每一个进程的CPU和内存使用量、swap使用量。使用上下光标键选择进程,F7和F8改变优先级,F9杀死进程。Htop不是系统默认安装的,所以需要额外安装。

htop output

5. nice

通过nice命令的帮助,用户可以设置和改变进程的优先级。提高一个进程的优先级,内核会分配更多CPU时间片给这个进程。默认情况下,进程以0的优先级启动。进程优先级可以通过top命令显示的NI(nice value)列查看。

进程优先级值的范围从-20到19。值越低,优先级越高。

nice <优先值> <进程名> - 通过给定的优先值启动一个程序

nice command

changed nice value of 'top'

上述命令例子中,可以看到‘top’命令获得了-3的优先值。

6. renice

renice命令类似nice命令。使用这个命令可以改变正在运行的进程优先值。注意,用户只能改变属于他们自己的进程的优先值。

renice -n -p - 改变指定进程的优先值

renice command

初始优先值为0的3806号进程优先值已经变成了4.

renice -u -g - 通过指定用户和组来改变进程优先值

output of renice for a user group

上述例子中,用户为‘mint’的所有进程优先值变为‘-3’。

7. kill

这个命令用于发送信号来结束进程。如果一个进程没有响应杀死命令,这也许就需要强制杀死,使用-9参数来执行。注意,使用强制杀死的时候一定要小心,因为进程没有时机清理现场,也许写入文件没有完成。如果我们不知道进程PID或者打算用名字杀死进程时候,killall就能派上用场。

kill <pid>
kill -9 <pid>
killall -9 - 杀死所有拥有同样名字的进程

如果你使用kill,你需要知道进程ID号。pkill是类似的命令,但使用模式匹配,如进程名,进程拥有者等。

pkill <进程名>

kill initiated

kill

8. ulimit

该命令用于控制系统资源在shell和进程上的分配量。对于系统管理员是最有用的,可以管理重度使用和存在性能问题的系统。限制资源大小可以确保重要进程持续运行,其他进程不会占用过多资源。

ulimit -a - 显示当前用户关联的资源限制

ulimit -a

-f - 最大文件尺寸大小
-v - 最大虚拟内存大小(KB)
-n - 增加最大文件描述符数量
-H : 改变和报告硬限制
-S : 改变和报告软限制

浏览ulimit man页面获取更多选项。

9. w

w 提供当前登录的用户及其正在执行的进程的信息。显示信息头包含信息,如当前时间、系统运行时长、登录用户总数、过去的1,5,15分钟内的负载均衡数。

基于这些用户信息,用户在终止不属于他们的进程时要小心。

'w' command

who是类似命令,提供当前登录用户列表、系统启动时间、运行级别等。

'who' command

whoami 命令输出当前用户ID

'whoami' command

10. pgrep

pgrep的意思是"进程号全局正则匹配输出"。该命令扫描当前运行进程,然后按照命令匹配条件列出匹配结果到标准输出。对于通过名字检索进程号是很有用。

pgrep -u mint sh

这个命令将会显示用户为‘mint’和进程名为‘sh’的进程ID。

output of pgrep

11. fg , bg

有时,命令需要很长的时间才能执行完成。对于这种情况,我们使用‘bg’命令可以将任务放在后台执行,而用‘fg’可以调到前台来使用。

我们可以通过‘&’在后台启动一个程序:

find . -name *iso > /tmp/res.txt &

一个正在运行的程序也可以通过“CTRL+Z”和“bg”命令组合放到后台运行。

find . -name *iso > /tmp/res.txt &     -  启动一个程序
ctrl+z      -   挂起当前执行程序
bg   -  将程序放到后台运行

我们可以使用‘jobs’命令列出所有后台进程。

jobs

使用‘fg’命令可以将后台程序调到前台执行。

fg %进程id

output of fg, bg and jobscommands

12. ipcs

ipcs命令报告进程间通信设施状态。(共享内存,信号量和消息队列)

用-p参数联合-m、-s或-q使用,可以获得相关的进程间通信的进程ID。

ipcs -p -m

下面屏幕截图列出了最近访问了共享内存段的进程的创建者的ID和进程ID。

ipcs command

总结

总之 ,这些命令可以帮助管理员修复问题和改善性能。同样作为一名普通用户也需要解决进程出现的问题。所以,熟悉如此繁多的命令,从能有效管理进程是行之有效。


via: http://linoxide.com/linux-command/process-management-commands-linux/

作者:B N Poornima 译者:VicYu/Vic020 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux作为Unix的衍生操作系统,Linux内建有查看当前进程的工具ps。这个工具能在命令行中使用。

PS 命令是什么

查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照。它能捕获系统在某一事件的进程状态。如果你想不断更新查看的这个状态,可以使用top命令。

ps命令支持三种使用的语法格式

  1. UNIX 风格,选项可以组合在一起,并且选项前必须有“-”连字符
  2. BSD 风格,选项可以组合在一起,但是选项前不能有“-”连字符
  3. GNU 风格的长选项,选项前有两个“-”连字符

我们能够混用这几种风格,但是可能会发生冲突。本文使用 UNIX 风格的ps命令。这里有在日常生活中使用较多的ps命令的例子。

1. 不加参数执行ps命令

这是一个基本的 ps 使用。在控制台中执行这个命令并查看结果。

不加选项执行ps命令

结果默认会显示4列信息。

  • PID: 运行着的命令(CMD)的进程编号
  • TTY: 命令所运行的位置(终端)
  • TIME: 运行着的该命令所占用的CPU处理时间
  • CMD: 该进程所运行的命令

这些信息在显示时未排序。

2. 显示所有当前进程

使用 -a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程。

$ ps -ax

这个命令的结果或许会很长。为了便于查看,可以结合less命令和管道来使用。

$ ps -ax | less

ps all 信息

3. 根据用户过滤进程

在需要查看特定用户进程的情况下,我们可以使用 -u 参数。比如我们要查看用户'pungki'的进程,可以通过下面的命令:

$ ps -u pungki

通过用户过滤

4. 通过cpu和内存使用来过滤进程

也许你希望把结果按照 CPU 或者内存用量来筛选,这样你就找到哪个进程占用了你的资源。要做到这一点,我们可以使用 aux 参数,来显示全面的信息:

$ ps -aux | less

显示全面信息

当结果很长时,我们可以使用管道和less命令来筛选。

默认的结果集是未排好序的。可以通过 --sort命令来排序。

根据 CPU 使用来升序排序

$ ps -aux --sort -pcpu | less

根据cpu使用排序

根据 内存使用 来升序排序

$ ps -aux --sort -pmem | less

根据内存使用来排序

我们也可以将它们合并到一个命令,并通过管道显示前10个结果:

$ ps -aux --sort -pcpu,+pmem | head -n 10

5. 通过进程名和PID过滤

使用 -C 参数,后面跟你要找的进程的名字。比如想显示一个名为getty的进程的信息,就可以使用下面的命令:

$ ps -C getty

通过进程名和PID过滤

如果想要看到更多的细节,我们可以使用-f参数来查看格式化的信息列表:

$ ps -f -C getty

通过进程名和PID过滤

6. 根据线程来过滤进程

如果我们想知道特定进程的线程,可以使用-L 参数,后面加上特定的PID。

$ ps -L 1213

根据线程来过滤进程

7. 树形显示进程

有时候我们希望以树形结构显示进程,可以使用 -axjf 参数。

$ps -axjf

树形显示进程

或者可以使用另一个命令。

$ pstree

树形显示进程

8. 显示安全信息

如果想要查看现在有谁登入了你的服务器。可以使用ps命令加上相关参数:

$ ps -eo pid,user,args

参数 -e 显示所有进程信息,-o 参数控制输出。Pid,User 和 Args参数显示PID,运行应用的用户该应用

显示安全信息

能够与-e 参数 一起使用的关键字是args, cmd, comm, command, fname, ucmd, ucomm, lstart, bsdstart 和 start

9. 格式化输出root用户(真实的或有效的UID)创建的进程

系统管理员想要查看由root用户运行的进程和这个进程的其他相关信息时,可以通过下面的命令:

$ ps -U root -u root u

-U 参数按真实用户ID(RUID)筛选进程,它会从用户列表中选择真实用户名或 ID。真实用户即实际创建该进程的用户。

-u 参数用来筛选有效用户ID(EUID)。

最后的u参数用来决定以针对用户的格式输出,由User, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME 和 COMMAND这几列组成。

这里有上面的命令的输出结果:

show real and effective User ID

10. 使用PS实时监控进程状态

ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。

当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。为此,我们可以将ps命令和watch命令结合起来

$ watch -n 1 ‘ps -aux --sort -pmem, -pcpu’

组合 ps 和 watch

如果输出太长,我们也可以限制它,比如前20条,我们可以使用head命令来做到。

$ watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’

组合 ps 和 watch

这里的动态查看并不像top或者htop命令一样。但是使用ps的好处是你能够定义显示的字段,你能够选择你想查看的字段。

举个例子,如果你只需要看名为'pungki'用户的信息,你可以使用下面的命令:

$ watch -n 1 ‘ps -aux -U pungki u --sort -pmem, -pcpu | head 20’

组合 ps 和 watch

结论

你也许每天都会使用ps命令来监控你的Linux系统。但是事实上,你可以通过ps命令的参数来生成各种你需要的报表。

ps命令的另一个优势是ps是各种 Linux系统都默认安装的,因此你只要用就行了。

不要忘了通过 man ps来查看更多的参数。(LCTT 译注:由于 ps 命令古老而重要,所以它在不同的 UNIX、BSD、Linux 等系统中的参数不尽相同,因此如果你用的不是 Linux 系统,请查阅你的文档了解具体可用的参数。)


via: http://linoxide.com/how-tos/linux-ps-command-examples/

作者:Pungki Arianto 译者:johnhoow 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

问题:我想知道当我调用一个特定的可执行文件在运行时载入了哪些共享库。是否有方法可以明确Linux上可执行程序或运行进程的共享库依赖关系?

查看可执行程序的共享库依赖关系

要找出某个特定可执行依赖的库,可以使用ldd命令。这个命令调用动态链接器去找到程序的库文件依赖关系。

$ ldd /path/to/program

注意!并不推荐为任何不可信的第三方可执行程序运行ldd,因为某些版本的ldd可能会直接调用可执行程序来明确其库文件依赖关系,这样可能不安全。

取而代之的是用一个更安全的方式来显示一个未知应用程序二进制文件的库文件依赖,使用如下命令:

$ objdump -p /path/to/program | grep NEEDED 

查看运行进程的共享库依赖关系

如果你想要找出被一个运行中的进程载入的共享库,你可以使用pldd命令,它会显示出在运行时被载入一个进程里的所有共享对象。

$ sudo pldd <PID>

注意你需要root权限去执行pldd命令。

或者,也可以选择一个叫做pmap的命令行工具。它报告一个进程的内存映射,也能显示出运行进程的库文件依赖。

$ sudo pmap <PID>


via: http://ask.xmodulo.com/check-library-dependency-program-process-linux.html

译者:KayGuoWhu 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux的命令行提供很多命令来杀死进程。比如,你可以向“kill”命传递一个PID来杀死进程;“pkill”命令使用一个正则表达式作为输入,所以和该模式匹配的进程都被杀死。

但是还有一个命令叫“killall”,默认情况下,它精确地匹配参数名,然后杀死匹配进程。在这篇文章中,我们将讨论有关这个命令的实际应用。

Linux 的 killall 命令

killall命令可以用来给一个特定的进程发送一个信号。这个信号默认情况下是SIGTERM,但也可以由killall命令使用参数来指定其它信号。

现在让我们通过一些实际的例子来看看这个命令的实际用法。

1. 基本示例

在这个例子中,我们将使用killall来杀死特定进程。假如,有两个开头字符相同的进程:

$ ps -aef | grep “test”
himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test
himanshu 3970 2811 0 14:14 pts/0 00:00:00 ./test_again

如何杀死“test\_again”进程呢?

$ killall test_again
[2]+ Terminated ./test_again

如你所见,killall命令终止了“test\_again”进程。你可以通过ps命令来确认这个事实:

$ ps -aef | grep “test”
himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test

你可以观察到“test\_again”没有被显示出来,因为它已经被杀死了。

2. 使用 -I 选项忽略大小写

默认情况下,killall命令是大小写敏感的。例如:

$ ps -aef | grep “test”
himanshu 4177 3161 0 14:54 pts/3 00:00:00 ./test
himanshu 4178 3161 0 14:54 pts/3 00:00:00 ./test_again
himanshu 4180 3161 0 14:54 pts/3 00:00:00 grep --color=auto test

$ killall TEST
TEST: no process found

你可以看到,killall命令找不到叫做“TEST”的进程,但是“test”进程是确确实实的在运行的。

来让killall命令忽略大小写,可以使用-I选项(大写i)。例如:

$ killall -I TEST
[1]- Terminated ./test

你可以观察到,现在你成功的终止了“test”进程。

3. 使用 -i 选项交互式的终止进程

killall命令可以用来终止多个进程。

$ killall test test_again
[2]- Terminated ./test_again
[3]+ Terminated ./test

但是,如果你想要killall交互式地来终止进程,你可以使用-i选项。

这里是例子:

$ killall -i test test_again
Kill test(4201) ? (y/N) y
Kill test_again(4202) ? (y/N) y
[1]- Terminated ./test
[2]+ Terminated ./test_again

你可以看到,用这种方式,在同时终止多个进程时,用户可以控制是否终止某一个进程。

4. 使用 -q 选项关闭命令执行回显

有些时候,当killall找不到指定的进程时,它就会像下面这样输出错误信息。

$ killall TEST
TEST: no process found

但是,当你想要killall执行地安安静静的话,你就可以使用-q选项:

$ killall -q TEST
$

如你所见,-q选项被使用之后,killall命令的输出信息就被抑制了。

5. 使用-l选项列出所有支持的信号(signal)

如之前描述的一样,killall向进程发送信号。

你可以使用-s选项(后面跟一个信号名)来向一个进程发送特殊信号。

想要知道所有可以发送的信号,可以使用-l选项(小写L)来获取:

$ killall -l
HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
UNUSED

killall支持上面的所有信号。

看着这些信号的名字,可能你心里就会嘀咕:这些信号都是干什么的?

译者注:使用下面的命令来获取所有信号的说明:

$ man 7 signal

我需要和大家讨论一件事情

killall命令的man说:假如进程的名字的长度小于等于15,默认情况下就会以完整名称匹配。

比如,假设有两个名字很长的进程:

$ ps -aef | grep “test”
himanshu 4021 3161 0 14:27 pts/3 00:00:00 ./test_abcdefghij
himanshu 4035 3161 0 14:27 pts/3 00:00:00 ./test_abcdefgh

第一个进程的名字有15个字符。现在,让我们试着使用killall杀死这个进程:

$ killall test_abcdefghij
[1]- Terminated ./test_abcdefghij

如你所见,killall命令成功杀死了这个进程。

假如,两个进程的名字都超过15个字符,根据man,killall将把两个进程全部杀死。比如:

$ ps -aef | grep “test”
himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
himanshu 4141 3161 0 14:46 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwxyz
himanshu 4143 3161 0 14:46 pts/3 00:00:00 grep --color=auto test

你可以观察到,两个进程的名字都超过15个字符。现在,当我使用killall试着杀死第二个进程时:

$ killall test_abcdefghijklmnopqrstuvwxyz
[6]+ Terminated ./test_abcdefghijklmnopqrstuvwxyz

它只杀死了指定的进程,另一个则没有被杀死。

$ ps -aef | grep “test”
himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
himanshu 4146 3161 0 14:47 pts/3 00:00:00 grep --color=auto test

我不太确定,是我进行的尝试中有不对的地方,还是这是killall的一个bug。假如你在评论中写上你的观点,我会非常感激。

顺便说一下,这是我机器上killall命令的版本信息:

$ killall --version
killall (PSmisc) 22.20
Copyright (C) 1993-2012 Werner Almesberger and Craig Small

PSmisc comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under
the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.

via: http://linoxide.com/linux-command/linux-killall-my-options/

译者:intermerlin 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

在本篇中,我们将继续配置网络特性。记住,网络是计算机最重要的特性,这篇文章和这之后的网络相关文章都要重点了解。

在我们开启这系列之前,我先要澄清一些事情。配置进程不会编辑你当前系统的内核。这个进程配置的是你编译(或者交叉编译)新内核前的源代码。一旦我完成了配置过程,那么我会讨论读者建议的话题。同样,作为提醒,每个段落中在引号或者括号中的第一句或者第二句(很少)的文本是配置工具中设置的名字。

首先,我们可以启用两个不同的稀疏型独立协议组播路由协议("IP: PIM-SM version 1 support" 和 "IP: PIM-SM version 2 support"),组播有点像广播,但是广播会给所有计算机发送信号而组播只会给选定的组或者计算机发送信号。所有PIM协议都是工作在IP的组播路由协议。

注意:当计算机与另外一台计算机或者服务器通信时,这叫做单播 - 只是以防你们想知道。

下一个要配置的网络特性是"ARP daemon support"。这让内核有一张IP地址表以及它们相应的在内部缓存中的硬件地址。ARP代表的是地址解析协议(Address-Resolution-Protocol)。

为了额外的安全,"TCP syncookie support"应该要启用。这保护计算机免于受到SYN洪水攻击。黑客或者恶意软件可能会发送SYN信息给一台服务器来消耗它的资源,以便让真实的访客无法使用服务器提供的服务。SYN消息会打开一个计算机和服务器之间的连接。Syncookie会阻断不正当的SYN消息。那么,真实的用户可以仍旧访问访问网站,而黑客则没办法浪费你的带宽。服务器应该启用这个特性。

下面的特性是用于 "Virtual (secure) IP: tunneling"。隧道是一个网络协议到另外一个网络协议的封装。当在使用虚拟私人网络(VPN)时需要使用安全隧道。

接下来,启用"AH transformation"增加对IPSec验证头的支持。这是一种管理数据验证的安全措施。

在这之后,启用"ESP transformation"增加对IPSec封装安全协议的支持。这是加密与可选择的数据验证的安全措施。

如果启用了这个特性(IP: IPComp transformation),Linux内核会支持IP负载压缩协议。这是一种无损压缩系统。无损指的是数据仍会保持完整,在解压缩后,数据在压缩前后没有变化。压缩在加密前先执行。由于更少的数据传输,所以这个压缩协议可以加速网络。

下面三个设置用于处理不同的IPsec特性("IP: IPsec transport mode"、"IP: IPsec tunnel mode"和"IP: IPsec BEET mode")。IPSec代表的是因特网安全协议(Internet Protocol SECurity).两台计算机之间并且/或者服务器间的传输模式是默认的IPSec模式。传输模式使用AH或者ESP头并且只加密IP头。在隧道模式下,IP头和负载会被加密。隧道模式通常用于连接网关到服务器/服务器或者服务器到服务器。BEET模式(Bound End-to-End Tunnel)不会在IP地址改变时重连。BEET模式下的连接会仍然存在。BEET模式比其他几种模式使用更少的字节。

下面,内核可以支持收到大量IPv4/TCP包时减轻栈负担(Large Receive Offload (ipv4/tcp))。网卡(NIC)处理TCP/IP栈。这个特性在内核中增加了处理大型栈的代码。

INET套接字可以启用(INET: socket monitoring interface)。INET套接字用于因特网。这个特性(当启用时)会监视来自或者发往因特网的连接与流量。

这里有另外一个套接字监视接口(UDP: socket monitoring interface)。这个用于用户数据报协议(User Datagram Protocol (UDP))。再说一下,这个特性监视UDP的套接字。

以下的设定会启用不同的TCP拥塞控制(TCP: advanced congestion control)。如果网络变得太忙或者带宽已满,那么许多计算机必须等待一些带宽或者它们的数据流会变慢。如果流量被合理管理,这回有助于网络性能提升。

TCP连接可以被MD5保护(TCP: MD5 Signature Option support)。这用于保护核心路由器之间的边界网关协议(Border Gateway Protocol (BGP))连接。核心路由器是网络中主要的路由器;这些路由器有时指的是因特网/网络的骨干。BGP是一种路由决策协议。

下一个设定允许你启用/禁用"The IPv6 protocol"。当你启用它,IPv4仍旧可以很好地工作。

下面的特性是一个特殊的隐私特性(IPv6: Privacy Extensions (RFC 3041) support)。这使得系统在网络接口中生成并使用不同的随即地址。

注意:计算机中没有数据是真正随机的。计算机中随机数和随机字串通常称为伪随机。

在多路由的网络中,这个特性允许系统能够更有效地计算出该使用哪一个(IPv6: Router Preference (RFC 4191))。

在这之后,一个用于处理路由信息的实验性特性可以启用/禁用(IPv6: Route Information (RFC 4191))。记住,在编译一个稳定内核时,除非你确实需要这个问题中特性,才去安装实验性的功能。

有时,当系统自动配置它的IPv6地址时,它可能会得到一个网络中已被使用的IPv6地址。这是一个允许重复地址检测(Duplicate Address Detection (DAD)的实验性特性(IPv6: Enable RFC 4429 Optimistic DAD)。

IPv6可以有不同的IPsecc特性支持("IPv6: AH transformation" 和 "IPv6: ESP transformation")。

IPv6同样可以使用先前讨论过的IP负载压缩协议(IP Payload Compression Protocol)(IPv6: IPComp transformation)。

这里甚至有IPv6移动支持(IPv6: Mobility)。这允许使用IPv6的移动设备在保留同样地址的情况下使用其他的网络。

再说一次,这里同样有一些针对IPv6的IPsec特性("IPv6: IPsec transport mode"、"IPv6: IPsec tunnel mode"、"IPv6: IPsec BEET mode")。

当启用此项后,IPv6可以支持MIPv6路由优化(IPv6: MIPv6 route optimization mode)。这样就可以确保最短和最佳网络路径了。如果消息在更少的路由和网络设备间发送,那么下载和上传速度就可以更快。

如果一个管理员需要连接到两个IPv6网络,但是只能通过IPv4来连接,这时内核使这个变得可能(IPv6: IPv6-in-IPv4 tunnel (SIT driver)。这通过隧道使IPv6报文穿越IPv4网络。

这个隧道特性是用于IPv6-in-IPv6 和 IPv4 tunneled in IPv6 (IPv6: IP-in-IPv6 tunnel (RFC2473))

另外一个隧道特性是(IPv6: GRE tunnel)。他只允许GRE隧道。(GRE:通用路由封装(Generic Routing Encapsulation))

允许支持多重路由表(IPv6: Multiple Routing Tables)。路由表是一张网络位置列表和数据要去目的地的路径。

允许根据源地址或前缀进行路由如果启用了(IPv6: source address based routing)。

"IPv6 Multicast routing"(IPv6组播路由)仍然是实验性质。IPv4和IPv6处理组播的方式不同。

典型的组播路由根据目标地址和源地址来处理组播包(IPv6: multicast policy routing)。启用这个选项会将接口和包的标记(mark)包含到决策中。

下面可以启用IPv6的PIM-SMv2 组播路由协议(IPv6: PIM-SM version 2 support)。这与先前提到的IPv4 PIM相同。因为IPv4和IPv6不同,所以PIM可以被v4/v6同时/分别激活

网络包标签协议(Network packet labeling protocols)(就像CIPSO和RIPSO)可以启用(NetLabel subsystem support)。这些标签包含了安全信息和权限。

网络包可以通过启用安全标记(Security Marking)变得更安全。

这个网络特性增加了一些开销(Time-stamping in PHY devices)。物理层(PHY)设备可以给网络包打上时间戳。PHY代表的是"PHYsical layer"。这些设备管理收到和发送的消息。

可以启用netfilter(Network packet filtering framework)。Netfilters过滤并修改过往的网络包。包过滤器是一种防火墙。如果包满足了一定的条件,包不会被允许通过。

数据报拥塞控制协议(Datagram Congestion Control Protocol)可以启用(The DCCP Protocol)。DCCP允许双向单播连接。DCCP有助于流媒体、网络电话和在线游戏。

下一步,流控制传输协议(Stream Control Transmission Protocol)可以启用(The SCTP Protocol)。SCTP工作在IP顶层并且是一个稳定可靠的协议。

下面的协议是可靠数据报套接字(Reliable Datagram Sockets)协议(The RDS Protocol)。

RDS可以使用Infiniband和iWARP作为一种支持RDMA的传输方式(RDS over Infiniband and iWARP),Infiniband和iWARP都是协议。RDMA代表的是远程直接内存访问(remote direct memory access)。RDMA用于一台远程计算机访问另一台计算机的内存而无需本机计算机操作系统的辅助。这就像直接内存访问(DMA),但是这里远程代替了本地计算机。

RDS同样可以使用TCP传输(RDS over TCP)

接下来,"RDS debugging messages"应该禁用。

下面的网络协议用于集群(The TIPC Protocol)。集群就是一组计算机作为一台计算机。它们需要有一个方式去通信,所以他们使用透明内部进程间通信协议(Transparent Inter Process Communication (TIPC))。

这个高速协议使用固定大小的数据包(Asynchronous Transfer Mode (ATM))。

使用ATM的IP可以与连接到一个ATM网络的IP的系统通信(Classical IP over ATM)。

下一个特性禁用"ICMP host unreachable"(ICMP主机不可达)错误信息(Do NOT send ICMP if no neighbor)。这防止了由于重新校验而移除ATMARP表被移除的问题。ATMARP表管理地址解析。ICMP代表的是因特网控制消息协议(Internet Control Message Protocol)并被常用于通过网络发送错误消息。

LAN仿真(LANE)仿真了ATM网络上的LAN服务(LAN Emulation (LANE) support)。一台LANE计算机可以作为桥接Ethernet和ELAN的代理。

"Multi-Protocol Over ATM (MPOA) support"允许ATM设备通过子网边界发送连接。

在这个特性下,至少在kernel看来ATM PVCs的行为就像Ethernet(RFC1483/2684 Bridged protocols)。PVC代表的是永久虚电路(permanent virtual circuit)。虚拟连接是一种基于包的连接,它伴随着主/原始协议使用其他更高层的协议。

"Layer Two Tunneling Protocol (L2TP)"(二层隧道协议)是隧道对应用透明。虚拟私有网络(Virtual Private Networks (VPNs))使用L2TP

要想使用基于Linux的以太网桥,启用这个桥特性(802.1d Ethernet Bridging)。在网络中,一个桥同时连接两个或者更多的连接。以太网桥是使用以太网端口的硬件桥。

"IGMP/MLD snooping"(IGMP/MLD 探听)是一种以太网桥能够基于IGMP/MLD负载选择性地转发组播信号的能力。禁用这个特性能够明显减少内核的大小。IGMP代表的是因特网组管理协议(Internet Group Management Protocol),这是一种被用于设置组播组的协议。MLD代表多播监听发现(Multicast Listener Discovery)。

下一个过滤特性允许以太网桥选择性地管理在每个数据包中的基于VLAN的信息的流量。禁用这个特性可以减小内核的大小。

通过启用这个特性(802.1Q VLAN Support),VLAN接口可以在以太网上创建。下面"GVRP (GARP VLAN Registration Protocol)"支持GVPR协议被用于在网络设备上注册某些vlan。

在这之后,"MVRP (Multiple VLAN Registration Protocol) support"(多重VLAN注册协议)可以启用。MVRP是GVRP更新的替代品。

"DECnet Support"是一种Digital公司发明的网络协议。这是一中既安全又稳定的协议。

"DECnet router support"允许用户制作基于Linux的支持DRCnet的路由。

注意:Linux可以用于服务器、工作站、路由器、集群、防火墙并支持其他许多用途。

下面的特性用于支持逻辑链路层2(Logical Link Layer type 2)(ANSI/IEEE 802.2 LLC type 2 Support)。这层允许在同一个网络设备上使用多个协议。强烈建议在网络很重要的环境中启用这个特性。最好所有内核都支持这个特性。

在下一篇文章中,我们将讨论更多的关于可以配置的网络设定。


via: http://www.linux.org/threads/the-linux-kernel-configuring-the-kernel-part-8.4525/

译者:geekpi 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出

Linux ps 命令

linux的ps命令是一个查看系统运行的进程的一个最基础的工具。它提供了一个当前进程的快照,还带有一些具体的信息,比如用户id,cpu使用率,内存使用,命令名等,它不会像top或者htop一样实时显示数据。虽然它在功能和输出上更加简单,但它仍然是每个linux新手需要了解和学好的必要进程管理/检测工具。

在本篇中,我们会学习ps命令基本的用法:查找、过滤,以不同的方式排序。

语法说明

ps命令有两种不同风格的语法规则:BSD风格和UNIX风格。Linux新手经常感到困惑并会误解这两种风格,所以在继续下一步之前,我们来弄清楚一些基本的信息。

注意: "ps aux"不等同于"ps -aux"。比如"-u"用于显示用户的进程,但是"u"意味着显示具体信息。

BSD 形式 - BSD形式的语法的选项前没有破折号,如:

ps aux

UNIX/LINUX 形式 - linux形式的语法的选项前有破折号,如:

ps -ef
在linux系统上混合这两种语法是可以的。比如 "ps ax -f"。但是本章中我们主要讨论UNIX形式语法。

如何使用ps命令

1. 显示所有进程

下面的命令可以显示所有进程的列表。

$ ps ax
$ ps -ef

通过管道输出到"less"可以分页。

使用"u"或者"-f"选项可以显示进程的具体信息。

$ ps aux
$ ps -ef -f
为什么USER列显示的不是我的用户名,但是其他的像root,www-data等却显示? 对于所有的用户(包括你们的),如果长度大于8个字符,那么ps只会显示你的UID而不是用户名。

2. 显示用户进程

使用"-u"选项后跟用户名来过滤所属用户的进程。多个用户名可以用逗号分隔。

$ ps -f -u www-data
UID        PID  PPID  C STIME TTY          TIME CMD
www-data  1329  1328  0 09:32 ?        00:00:00 nginx: worker process
www-data  1330  1328  0 09:32 ?        00:00:00 nginx: worker process
www-data  1332  1328  0 09:32 ?        00:00:00 nginx: worker process
www-data  1377  1372  0 09:32 ?        00:00:00 php-fpm: pool a.localhost                                               
www-data  1378  1372  0 09:32 ?        00:00:00 php-fpm: pool a.localhost                                               
www-data  4524  2359  0 10:03 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  4527  2359  0 10:03 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  4528  2359  0 10:03 ?        00:00:00 /usr/sbin/apache2 -k start

3. 通过名字或者进程id显示进程

通过"-C"选项后面加上名字或者命令来搜索进程。

$ ps -C apache2
  PID TTY          TIME CMD
 2359 ?        00:00:00 apache2
 4524 ?        00:00:00 apache2
 4525 ?        00:00:00 apache2
...

要通过进程id显示进程,就使用"-p"选项,并且还可以通过逗号分隔来指定多个进程id。

$ ps -f -p 3150,7298,6544

"-C"必须提供精确的进程名,并且它并不能通过部分名字或者通配符查找。为了更灵活地搜索进程列表,通常使用grep命令。

$ ps -ef | grep apache

4. 通过cpu或者内存使用排序进程

系统管理员通常想要找出那些消耗最多内存或者CPU的进程。排序选项会基于特定的字段或者参数来排序进程列表。

可以用'--sort'指定多个字段,并用逗号分割。除此之外,字段前面还可以跟上'-'或者'+'的前缀来相应地表示递减和递增排序。这里有很多的用于排序的选项,通过man页来获取完整的列表。

$ ps aux --sort=-pcpu,+pmem

显示前5名最耗cpu的进程。

$ ps aux --sort=-pcpu | head -5
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  2.6  0.7  51396  7644 ?        Ss   02:02   0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
root      1249  2.6  3.0 355800 30896 tty1     Rsl+ 02:02   0:02 /usr/bin/X -background none :0 vt01 -nolisten tcp
root       508  2.4  1.6 248488 16776 ?        Ss   02:02   0:03 /usr/bin/python /usr/sbin/firewalld --nofork
silver    1525  2.1  2.3 448568 24392 ?        S    02:03   0:01 /usr/bin/python /usr/share/system-config-printer/applet.py

5. 以树的形式显示进程层级

许多进程实际上是从同一个父进程fork出来的,了解父子关系通常是很有用的。"--forest" 选项会构造一个ascii艺术形式的进程层级视图。

下面的命令会用apache2的进程名来搜索并构造一个树来显示具体信息。

$ ps -f --forest -C apache2
UID        PID  PPID  C STIME TTY          TIME CMD
root      2359     1  0 09:32 ?        00:00:00 /usr/sbin/apache2 -k start
www-data  4524  2359  0 10:03 ?        00:00:00  \_ /usr/sbin/apache2 -k start
www-data  4525  2359  0 10:03 ?        00:00:00  \_ /usr/sbin/apache2 -k start
www-data  4526  2359  0 10:03 ?        00:00:00  \_ /usr/sbin/apache2 -k start
www-data  4527  2359  0 10:03 ?        00:00:00  \_ /usr/sbin/apache2 -k start
www-data  4528  2359  0 10:03 ?        00:00:00  \_ /usr/sbin/apache2 -k start
不要在排序中使用树状显示,因为两者都会以不同方式影响显示的顺序。

6. 显示父进程的子进程

下面一个是找出所有从apache进程fork出来的进程的例子。

$ ps -o pid,uname,comm -C apache2
  PID USER     COMMAND
 2359 root     apache2
 4524 www-data apache2
 4525 www-data apache2
 4526 www-data apache2
 4527 www-data apache2
 4528 www-data apache2

第一个属于root的进程是apache2的主进程,其他的apache进程都是从主进程fork出来的。下面的命令使用apache2主进程的pid列出了所有的apache2的子进程。

$ ps --ppid 2359
  PID TTY          TIME CMD
 4524 ?        00:00:00 apache2
 4525 ?        00:00:00 apache2
 4526 ?        00:00:00 apache2
 4527 ?        00:00:00 apache2
 4528 ?        00:00:00 apache2

7. 显示进程的线程

"-L"选项会随着进程一起显示线程。它可用于显示所有指定进程或者所有进程的线程。

下面的命令会显示进程id为3150的进程的所有线程。

$ ps -p 3150 -L

8. 改变显示的列

ps命令可以被配置用来只显示被选中的列。很多列可以被用来显示,完整的列表可以查看man页。

下面的命令会只显示pid、用户名、cpu、内存、命令列。

$ ps -e -o pid,uname,pcpu,pmem,comm

同样可以重命名列的名字。

$ ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm
  PID USERNAME CPU_USAGE %MEM COMMAND
    1 root           0.0  0.0 init
    2 root           0.0  0.0 kthreadd
    3 root           0.0  0.0 ksoftirqd/0
    4 root           0.0  0.0 kworker/0:0
    5 root           0.0  0.0 kworker/0:0H
    7 root           0.0  0.0 migration/0
    8 root           0.0  0.0 rcu_bh
    9 root           0.0  0.0 rcuob/0
   10 root           0.0  0.0 rcuob/1

非常灵活。

9. 显示进程运行的时间

运行的时间指的是,进程已经运行的时间。运行时间的列并没有默认显示,需要使用-o选项带入。

$ ps -e -o pid,comm,etime

10. 将ps转换为实时进程查看器

通常上,watch命令可将ps命令变成实时进程查看器。像这个简单的命令

$ watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15'

我桌面上的输出如下。

Every 1.0s: ps -e -o pid,uname,cmd,pmem,pcpu --...  Sun Dec  1 18:16:08 2013

  PID USER     CMD                         %MEM %CPU
 3800 1000     /opt/google/chrome/chrome -  4.6  1.4
 7492 1000     /opt/google/chrome/chrome -  2.7  1.4
 3150 1000     /opt/google/chrome/chrome    2.7  2.5
 3824 1000     /opt/google/chrome/chrome -  2.6  0.6
 3936 1000     /opt/google/chrome/chrome -  2.4  1.6
 2936 1000     /usr/bin/plasma-desktop      2.3  0.2
 9666 1000     /opt/google/chrome/chrome -  2.1  0.8
 3842 1000     /opt/google/chrome/chrome -  2.1  0.8
 4739 1000     /opt/google/chrome/chrome -  1.8  1.0
 3930 1000     /opt/google/chrome/chrome -  1.7  1.0
 3911 1000     /opt/google/chrome/chrome -  1.6  0.6
 3645 1000     /opt/google/chrome/chrome -  1.5  0.4
 3677 1000     /opt/google/chrome/chrome -  1.5  0.4
 3639 1000     /opt/google/chrome/chrome -  1.4  0.4

输出会每秒刷新状态,但是这其实很top不同。你会发现top/htop命令的输出相比上面的ps命令刷新得更频繁。

这是因为top输出是结合了cup使用值和内存使用值后的排序值。但是上面的ps命令是一个更简单的行为的排序,每次获取一列(像学校的数学),因此它不会像top那样快速更新。


via: http://www.binarytides.com/linux-ps-command/

译者:geekpi 校对:Caroline

本文由 LCTT 原创翻译,Linux中国 荣誉推出