到目前为止,您知道输入命令都对应于磁盘上的文件。当命令被Shell解释和执行时,操作系统会创建相应的进程,这些进程在完成工作后就会退出,许多进程会在系统中停留很长时间。要查看当前哪些进程可用,请输入ps命令。该命令常用的参数组合是ps -ef和ps aux。在一个流程中,你也可以创建一个流程,成为一个子流程,这就引出了流程树的概念。进入pstree,你会看到一棵树。这些命令中的PID表示入口编号。如果要强制终止一个进程,可以使用kill PID来执行。类似的命令包括kill xxx和pkill xxx来杀死所有名字为xxx的进程。您可能会看到kill -9 PID这样的命令。-9表示一个信号。输入kill -l查看所有信号。你会发现9号)是SIGKILL,表示强制结束信号。信号是进程间异步通信的一种机制。有些信号是强制性的,有些信号过程可以忽略。
1)SIGHUP 2)SIGINT 3)SIGQUIT 4)SIGILL 5)SIGTRAP
6)SIGABRT 7)SIGBUS 8)SIGFPE 9)sigkill 10)sigusr 1
11)sigsegv 12)sigusr 213)sigpipe 14)SIGALRM15)SIGTERM
16)SIGSTKFLT17)sigchld 18)sigcont 19)sigstop 20)SIGTSTP
21)sigttin 22)sigttou 23)sigurg 24)sigxcpu 25)SIGXFSZ
26)SIGVTALRM27)sigprofi 28)sigwinch 29)SIGIO30)SIGPWR
31)SIGSYS34)SIGRTMIN 35)SIGRTMIN 136)SIGRTMIN 237)SIGRTMIN 3
38)SIGRTMIN 439)SIGRTMIN 540)SIGRTMIN 641)SIGRTMIN 742)SIGRTMIN 8
43)SIGRTMIN 944)SIGRTMIN 1045)SIGRTMIN 1146)SIGRTMIN 1247)SIGRTMIN 13
48)SIGRTMIN 1449)SIGRTMIN 1550)SIGRTMAX-1451)SIGRTMAX-1352)SIGRTMAX-12
53)SIGRTMAX-1154)SIGRTMAX-1055)SIGRTMAX-956)SIGRTMAX-857)SIGRTMAX-7
58)SIGRTMAX-659)SIGRTMAX-560)SIGRTMAX-461)SIGRTMAX-362)SIGRTMAX-2
63) SIGRTMAX-164) SIGRTMAX无论你使用ps、ps -ef、ps aux还是pstree,你都会发现列表中有一项就是命令本身,因为当你运行命令的时候,进程还没有结束,所以列表中包含了它对应的进程。
docker @ manager : ~/test $ PS aux
用户PID %中央处理器%MEM VSZ RSS TTY统计开始时间命令
根1 0.0 0.1 4164 1016?SS 03:33 0336009/s滑稽希望/init
根2 0.0 0.0 0 0?S 03:33 0:00 [kthreadd]
root 4 0.0 0.0 0 0?I 03:33 0:00[kworker/0:0H]
root 6 0.0 0.0 0 0?I 03:33 0:00[mm _ PERC pu _ wq]
.
docker 7798 0.0 0.1 7276 1880 pts/0 R 06:47 0:00 PS aux
docker @ manager : ~/test $ PS tree
init-VBox ServiCe-
|-acpid
|-crond
|-dockerd - containerd
|-宽恕-盖蒂-巴什
|-原谅-睡觉
|-ntpd
|-SSHD-SSHD-巴什-pstree//当前进程
|-udevd - 2*[udevd]
`-2 *[udh ccpc]
系统将为每个进程分配资源。这些资源不仅包括cpu时间片、内存、文件句柄、数据缓冲区等。如前所述,正常运行时间可以检查系统负载。如果系统负载很重,应该怎么做才能找出哪个途径占用了系统资源?最简单的方法是输入top命令,该命令将打印并继续。
刷新进程的信息,通常我们最关心的是 PID、%CPU、%MEM、COMMAND 这4列, 按 M 可以按照进程占用内存大小排序,按 P 可以按照进程占 CPU 排序,c 可以切换进程的全路径,h 查看帮助,w 可以把当前设置保存到文件里面,按 enter 可以立马刷新进程信息,你可以一直按一直按或按住不放,不同的发行版本 top 显示的数据不太相同,但是大同小异,这个命令还有一个增强版 htop,但是需要单独安装软件包,由于还没有讲到软件包管理这章,所以暂且知道就行了。top - 15:06:38 up 284 days, 14:28, 1 user, load average: 0.01, 0.07, 0.07 Tasks: 313 total, 1 running, 311 sleeping, 0 stopped, 1 zombie Cpu(s): 1.3%us, 0.7%sy, 0.0%ni, 98.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Mem: 4048224k total, 3646004k used, 402220k free, 80040k buffers Swap: 0k total, 0k used, 0k free, 1029896k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1374 mongodb 20 0 6024m 365m 291m S 0 9.2 4116:39 /usr/风趣的盼望/mongod --config /etc/mongod.conf ......在 top 界面按下 ctrl + z 后,top 命令就被切换到了后台,可以使用 ps 和 jobs 命令确认。
ubuntu@ebs-33107:~/test$ ps PID TTY TIME CMD 5111 pts/0 00:00:00 bash 6379 pts/0 00:00:03 top 6622 pts/0 00:00:00 ps ubuntu@ebs-33107:~/test$ jobs [1]+ Stopped top可以使用 fg 命令把恢复到前台显示,输入 fg 1,其中 1 是任务的序号,只有一个任务的时候可以只输入 fg,bg 可以将任务在后台继续运行。当我们执行一个命令需要运行很长时间的时候,就可以把进程切换到后台,同时输入其他的命令。需要注意的是,当用户退出 shell 的时候任务会停止执行,当我们远程登录到服务器上执行任务的时候,如果希望退出了后任务依然运行,可以借助 nohup 这个命令,它的英文愿意是 no hang up,默认情况下它会把命令的输出放在当前目录的 nohup.out 文件中,默认的 & 表示把命令放到后台执行。
ubuntu@ebs-33107:~$ nohup find / -name xxx & [1] 8427 ubuntu@ebs-33107:~$ nohup: ignoring input and appending output to ‘nohup.out’ ubuntu@ebs-33107:~$ jobs [1]+ Running nohup find / -name xxx &我们退出终端后重新进入,执行 jobs 啥也没有? 不是说好了要一直运行吗,骗子! 这里有一个坑注意一下,jobs 命令本身只能回显当前终端下的任务列表,需要使用 ps aux 或者 ps -ef 命令来确认,什么还是没有,骗子! 可能因为 find 已经完成使命结束了,试试 cat nohup.out 看看执行结果。
来一个更极端的例子,我们使用 ping localhost 查看本机的 ip 地址,退出后再执行 jobs 查看发现啥也没有,好家伙 jobs 居然不讲武德,使用 tail 和 ps 可以确认任务仍然在运行。
ubuntu@ebs-33107:~$ nohup ping localhost & [1] 11897 ubuntu@ebs-33107:~$ nohup: ignoring input and appending output to ‘nohup.out’ ubuntu@ebs-33107:~$ jobs [1]+ Running nohup ping localhost & // 使用 tail -f nohup.out 命令查看 ping 任务可以看到不断有输出, 64 bytes from localhost (127.0.0.1): icmp_seq=93 ttl=64 time=0.097 ms 64 bytes from localhost (127.0.0.1): icmp_seq=491 ttl=64 time=0.094 ms 64 bytes from localhost (127.0.0.1): icmp_seq=748 ttl=64 time=0.088 ms 64 bytes from localhost (127.0.0.1): icmp_seq=707 ttl=64 time=0.018 ms 64 bytes from localhost (127.0.0.1): icmp_seq=94 ttl=64 time=0.080 ms // ctrl + c 退出 tail 命令 exit // 退出终端 // 重新登录终端后输入 jobs 啥也没有 ubuntu@ebs-33107:~$ jobs ubuntu@ebs-33107:~$ tail -f nohup.out 64 bytes from localhost (127.0.0.1): icmp_seq=42 ttl=64 time=0.096 ms 64 bytes from localhost (127.0.0.1): icmp_seq=43 ttl=64 time=0.125 ms 64 bytes from localhost (127.0.0.1): icmp_seq=44 ttl=64 time=0.089 ms ...... // 一直在输出,说明 ping localhost 还在干活儿 // 用 ps 确认一下 ubuntu@ebs-33107:~$ ps aux | grep ping // 表示过滤出有 ping 字符串的进程,后面管道章节详细介绍 ubuntu 12757 0.0 0.0 8604 860 ? S 16:04 0:00 ping localhost ubuntu 13276 0.0 0.0 17776 924 pts/0 S+ 16:05 0:00 grep --color=auto ping输入 kill 12757 让它见dfddb去,rm nohup.out 清理输出文件。
你可能会看到很多很多使用 nohup 命令的时候带有 >/dev/null 和 2>&1 的命令参数,这是关于输入输出重定向的知识,后面的内容会详细介绍。
到目前为止,你已经学习了大量的 linux 基础知识,虽然有的知识点只是走马观花或者只有一个概念性的东西,学习是不断积累的工程,学习方法比知识本身更重要,一个软件80%的功能我们是用不到的,所以即便你觉得某个知识点很模糊,很肤浅,也不要觉得心理不安,用到时候你再去搜索,再去看看他的帮助,重要的是建立 linux 这一系列的知识体系,哦,原来 linux 是这个样子工作的,随着不断的积累和试错,在脑子里不断修正对它最初的样子,你会发现原来一切都是那么经典。