Linux程序和进程

Zhan, Anthony| 2013-09-08 服务器管理 评论数( 0 )

Linux的程序管理与文件管理不同, 程序管理会更加复杂. 你需要理解Bash是如何执行二进制程序和脚本语言的, 而且其中很多细节需要特别注意.

运行程序

无论是二进制程序还是脚本语言, 通过shell运行的方式有3种:

1. 运行环境变量PATH目录里的程序:

如ls, ps, tar, pwd … 在任何目录下, 直接输入命令名称即可直接运行的程序

$ ls -al

我们可以通过以下命令查看环境变量PATH:

anthony@z:~$ echo $PATH

/home/anthony/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

然后再看看/bin目录下有哪些东西:

anthony@z:/bin$ cd /bin
anthony@z:/bin$ ls
bash          dd             lessfile        open        tar
bunzip2       df             lesskey         openvt      tempfile
busybox       dir            lesspipe        pidof       touch
bzcat         dmesg          ln              ping        true
bzcmp         dnsdomainname  loadkeys        ping6       umount
bzdiff        domainname     login           ps          uname
bzegrep       dumpkeys       ls              pwd         uncompress
……

2. 通过绝对路径运行程序:

例如:

$ /home/anthony/programs/my-app

其实, 第一种情况也可以通过绝对路径运行, 例如

$ /bin/ls -al

当然这看着很笨拙.

3. 运行当前目录下的程序:

$ cd programs
$ ./my-app

需要注意的是文件名前的”./”, “.”表示当前目录, 就像”..”表示父级目录一样. “/”是路径中, 目录,文件之间的分隔符. “./”告诉系统, 现在要运行的程序在当前目录下, 这也能很好的与第一种情况区分开来.

在终端内, 通过以上三种方式运行一个程序, 程序终止前, 你不能做其他任意操作. 现在的问题是, 如果程序执行需要很长的时间, 该如何处理.

1. 中断

Ctrl+c

同时按住键盘的Ctrl键和c键, 告诉系统终止当前运行的程序.

2. 后台执行

Ctrl+z

同时按住键盘的Ctrl键和z键, 告诉系统将当前运行的程序放到后台运行. 还有一种方式, 在程序运行前, 在命令行最后加一个”&”符号, 告诉系统, 将程序放到后台执行, 如

$ cp bigvideo.avi ~/movies/ &
[6] 2623
$ [6]	Done 	cp bigvideo.avi ~/movies/ &

系统服务

其实, 系统中很多运行在后台的程序, 并不是通过上述方式, 在命令后面加”&”实现的. 像网站服务器, apache, highthttpd, niginx, 这些是作为系统服务, 在系统启动后就运行了.

这些作为系统服务的应用程序, 一般是通过一些相对复杂的脚步实现对其开启和关闭控制的. 这些脚本可以在/etc/init.d目录下找到.

以Apache为例:

开启:
/etc/init.d/apache2 start
关闭:
/etc/init.d/apache2 stop
重启:
/etc/init.d/apache2 restart

进一步深入讲解, 放到以后章节.

进程管理

系统运行的进程都有一个唯一的标识ID, 叫做PID. 进程管理的第一步, 就是找到相应的PID.

1. ps

如何查找PID, 必须要介绍的一个工具就是 -- ps.

$ ps -A
$ ps aux
$ ps axjf

通常使用最多的就是”ps aux”, 列出系统中正在运行的所有程序

au(x) 输出格式 :

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER: 行程拥有者 
PID: pid 
%CPU: 占用的 CPU 使用率 
%MEM: 占用的记忆体使用率 
VSZ: 占用的虚拟记忆体大小 
RSS: 占用的记忆体大小 
TTY: 终端的次要装置号码 (minor device number of tty) 
STAT: 该行程的状态: 
D: 不可中断的静止 
R: 正在执行中 
S: 静止状态 
T: 暂停执行 
Z: 不存在但暂时无法消除 
W: 没有足够的记忆体分页可分配

当直接输入该命令时, 你会看到输出结果中有很多条记录. 这时候, 如果一条一条得查看会很累, 这里可以通过以下方法, 过滤出你想要的记录:

anthony@z:~$ ps aux | grep apache
root      1182  0.0  1.7 383256 17532 ?        Ss   10:27   0:01 /usr/sbin/apache2 -k start
www-data  1416  0.0  0.9 383256  9620 ?        S    10:27   0:00 /usr/sbin/apache2 -k start
www-data  1417  0.0  0.9 383256  9620 ?        S    10:27   0:00 /usr/sbin/apache2 -k start
www-data  1418  0.0  0.9 383256  9620 ?        S    10:27   0:00 /usr/sbin/apache2 -k start
www-data  1419  0.0  0.9 383256  9620 ?        S    10:27   0:00 /usr/sbin/apache2 -k start
www-data  1420  0.0  0.9 383256  9620 ?        S    10:27   0:00 /usr/sbin/apache2 -k start
anthony   3110  0.0  0.0   7548   852 pts/1    S+   16:25   0:00 grep apache

该指令将"ps aux"的输出结果, 通过”|”管道输出给grep, 进行过滤. grep的具体介绍, 放到以后章节中.

2. top

top是一个非常有用的性能分析工具, 实时显示系统中各个进程的资源占用情况.

top - 16:32:50 up  6:05,  2 users,  load average: 0.00, 0.00, 0.00
Tasks:  92 total,   1 running,  91 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.2%sy,  0.0%ni, 99.6%id,  0.0%wa,  0.0%hi,  0.2%si,  0.0%st
Mem:   1026024k total,   213620k used,   812404k free,     7148k buffers
Swap:   892920k total,        0k used,   892920k free,   118028k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1182 root      20   0  374m  17m 8864 S    0  1.7   0:01.18 apache2
 3134 anthony   20   0 19072 1340 1020 R    0  0.1   0:00.03 top
    1 root      20   0  8356  844  712 S    0  0.1   0:02.11 init
    2 root      20   0     0    0    0 S    0  0.0   0:00.00 kthreadd
    3 root      RT   0     0    0    0 S    0  0.0   0:00.10 migration/0
    4 root      20   0     0    0    0 S    0  0.0   0:00.00 ksoftirqd/0
    5 root      RT   0     0    0    0 S    0  0.0   0:00.00 watchdog/0
    6 root      RT   0     0    0    0 S    0  0.0   0:00.04 migration/1
    7 root      20   0     0    0    0 S    0  0.0   0:00.00 ksoftirqd/1
    8 root      RT   0     0    0    0 S    0  0.0   0:00.00 watchdog/1
    9 root      20   0     0    0    0 S    0  0.0   0:00.33 events/0
   10 root      20   0     0    0    0 S    0  0.0   0:00.28 events/1
   11 root      20   0     0    0    0 S    0  0.0   0:00.00 cpuset
   12 root      20   0     0    0    0 S    0  0.0   0:00.00 khelper
   13 root      20   0     0    0    0 S    0  0.0   0:00.00 netns
   14 root      20   0     0    0    0 S    0  0.0   0:00.00 async/mgr
   15 root      20   0     0    0    0 S    0  0.0   0:00.00 pm
   16 root      20   0     0    0    0 S    0  0.0   0:00.04 sync_supers
   17 root      20   0     0    0    0 S    0  0.0   0:00.05 bdi-default

3. kill

前面介绍的通过Ctrl+c可以终止当前正在运行的应用程序. 执行kill命令也能达到同等的效果.

首先查找需要终止的进程的pid, 然后执行以下命令:

$ kill 3194

如果没有返回任何结果, 则说明执行成功. 执行不成功的原因大致有两种, 一个是pid不存在, 另一个是程序被锁了. 对于第二种情况, 可以执行以下命令, 强制终止进程:

$kill -9 3194

最后, 我们可能需要, 一次性删除多条进程. 例如, apache除了主进程, 还有多个子进程. 这时, 我们需要使用以下方法删除所有apache进程(以debian为例):

$killall apache2

聚焦云计算,扫描二维码,关注HostUCan云计算

有好的文章希望站长之间帮助分享推广,猛戳这里我要投稿

您需要登录后才可以评论登录|注冊

暂无评论