我们知道windows是一个多任务操作系统,同时运行的任务可以任意切换,还有任务管理器,*nix也是。你一定不会满足一次只执行一个程序,等待程序结束后再执行下一个。下面我们来看看怎么做:
后台启动
找一个耗时比较长的例子来说明一下问题:
$ sleep 10 (10秒后) $
这是程序在前台运行时的情形,如果你等不及,那么你可以在执行时让它在后台运行:
$ sleep 10 & [1] 31415 $ $ $ $ [1]+ Done sleep 10 $
在命令的后面加一个”&“符号,这时候shell给你一个作业号和进程ID,表示刚才的任务已经进入后台。然后你随意进行一些操作(如果你不做任何操作,你不会得到通知),我这里的例子是直接回车几次,程序运行结束后,你会得到通知。
前后台切换
还是sleep的例子
$ sleep 20 ^Z [1]+ Stopped sleep 20 $ jobs [1]+ Stopped sleep 20 $ bg 1 [1]+ sleep 20 & $ jobs [1]+ Running sleep 20 & $ fg 1 sleep 20 $
^Z表示按下Ctrl+Z 把前台程序挂起,并分配了一个作业号1,此时程序暂停运行
jobs 查看一下当前的作业
bg 1 把作业号为1的作业设定为后台运行,此时程序继续运行
fg 1 把作业号为1的作业切换到前台
这几个操作,一般来说,是用于全屏编辑器那样的程序。对于普通的*nix程序,在后台运行的话,我们都会把它的输出重定向到文件,或者它自己记日志文件,因此没有必要再切换到前台,除非我要——杀死它
杀死进程
有两种方式:
1. 如果它在前台,那么按Ctrl+C,向它发出一个中断信号,通常就死了,在后台的话,用前面说的fg命令切换到前台再Ctrl+C
2. 如果它不响应Ctrl+C,或者不在作业范围内,也就是说没有作业号,而只有一个进程ID,那么用kill命令。
kill命令的前提是你要知道进程ID,获取进程ID可以用ps
$ sleep 100 & [1] 31505 $ ps PID TTY TIME CMD 31371 pts/0 00:00:00 bash 31505 pts/0 00:00:00 sleep 31506 pts/0 00:00:00 ps $ kill 31505 [1]+ Terminated sleep 100 $
如果你遇到kill也杀不死的情况下,你试试kill -9,这是发送了一个不可被程序拦截的信号。
还有一个极端情况,程序既不响应Ctrl+C,也无法挂起(Ctrl+Z),这样只好再开一个终端了。
终端连接
一般来说,虽然*nix的shell具备有限的多任务特性,但这对于用过windows的人来说是远远不够的。
所以我们都会建立多个终端到主机的连接。
第一种方式:
如果是直接与主机相连的终端,例如你在本机安装了一个*nix,或者你跑到机房里去管理服务器,那么你按Alt+F1,Alt+F2...可以切换不同的终端。
第二种方式:
用图形界面的软件,例如SecureCRT或putty,通过ssh或者telnet连接到*nix,你可以在这些软件中建立多个到主机的连接,用选项卡在不同连接中切换。
当拥有多个终端时,例如调试C/S结构软件时,可以在一个终端中运行服务器,另一个终端运行客户端。又例如在一个终端中写代码和编译,另一个终端中运行以查看结果。
补充
top命令 提供一个相当于windows下的任务管理器界面,但是这种事情还是GUI程序更拿手。一般用top看一下当前系统的资源占用情况,哪些程序占用CPU,按<Space>手动刷新,按q退出。
top - 13:30:05 up 1 day, 3:44, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 68 total, 1 running, 67 sleeping, 0 stopped, 0 zombie Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 124720k total, 85944k used, 38776k free, 20216k buffers Swap: 530136k total, 2048k used, 528088k free, 30844k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1 root 20 0 1656 568 520 S 0.0 0.5 0:12.70 init 2 root 15 -5 0 0 0 S 0.0 0.0 0:00.01 kthreadd 3 root RT -5 0 0 0 S 0.0 0.0 0:00.00 migration/0 4 root 15 -5 0 0 0 S 0.0 0.0 0:00.87 ksoftirqd/0 5 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0 6 root 15 -5 0 0 0 S 0.0 0.0 0:00.20 events/0 7 root 15 -5 0 0 0 S 0.0 0.0 0:00.03 khelper 12 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 async/mgr 117 root 15 -5 0 0 0 S 0.0 0.0 0:00.20 kblockd/0 120 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kacpid 121 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kacpi_notify 122 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kacpi_hotplug 170 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 kseriod 216 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd 217 root 20 0 0 0 0 S 0.0 0.0 0:00.67 pdflush 219 root 15 -5 0 0 0 S 0.0 0.0 0:01.65 kswapd0 220 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 aio/0 221 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 nfsiod 222 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 xfs_mru_cache 223 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 xfslogd/0 224 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 xfsdatad/0 225 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 xfsconvert<mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/themes/advanced/langs/zh.js"></mce:script><mce:script type="text/javascript" src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js" mce_src="http://hi.images.csdn.net/js/blog/tiny_mce/plugins/syntaxhl/langs/zh.js"></mce:script>d/0 226 root 15 -5 0 0 0 S 0.0 0.0 0:00.00 crypto/0
uptime命令 显示当前系统运行时间和负载,就是刚才top命令显示出的第一行
ps -ef 它比ps命令输出更多更详细的进程列表。单纯的ps只列出用户自己的进程,而这个命令列出所有用户和系统的进程。
Ctrl+q,Ctrl+s 如果你不小心按到了Ctrl+q,终端上会暂停任何显示,但是依然接受你的输入,你的感觉就是系统没响应了,这时候你按一下Ctrl+s,终端会继续显示。因此遇到系统没响应的时候,先别乱按,注意一下是不是按到Ctrl+q了