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