进阶第三课:什么是进程?为什么有的程序怎么都关不掉
首部三篇阐述了文件操作、磁盘以及用户权限。此篇讲述一个几乎各日都会运用到, 然而众多新手实际上并未弄清楚的概念: 进程。你所能运行的每一个程序, 在Linux的视角下究竟是什么? 为何有时某个程序“卡死”了, 寻常的关闭方式不起作用, 非得借助一种更为“暴力”的方式方可使之停止运行? 零、一种每个人都遭遇过的情景。你在终端里运行了一个程序python3 my_script.py程序卡住了一直没反应终端也被占着敲什么都没用。这时候你可能会这篇文章打算向你传达这样一个情况: 这个被称作“卡住的程序”的东西, 在Linux环境当中被叫做一个“进程”, 并且Linux筹备了专门的途径去对其进行查看, 去加以管理, 在必要的情形下将其关闭, 完全不需要通过重启电脑这般大费周章的做法。一、进程到底是什么正在运行的程序先分清两个容易混淆的概念程序呀, 它是那样一种事物, 一个静静地躺在硬盘上特定盘符位置文件中的东西, 诸如处于像 /usr/bin/ 这样的地方, 它当时并没有处于那种所谓“运行”的状态, 仅仅是一堆以代码形式存在于磁盘之上的内容。进程: 这个程序, 被启动起来, 正于电脑里运行, 是那个“活着的实例”。有一种类比, 程序宛如静静印于纸面的菜谱, 进程就如同就着这份菜谱, 于厨房正在实际着手做菜的厨师, 食谱相同, 然可诸多大厨于不同厨房分别照做, 如开启三个终端窗口, 皆运行同一指令, 便会生成三个全然独立、互不干扰之进程。二、每个进程都有一个工牌PID系统当中, 运行着数量众多的进程, 成百上千个之多, 为了能够将它们区别开来, 每一个进程都拥有一个独一无二的编号, 这个编号被称作PID, 也就是进程编号的意思。想看看现在系统里都在运行什么进程ps aux输出大概是这样USER PID %CPU %MEM COMMAND root 1 0.0 0.1 /sbin/init deploy 1234 0.2 1.5 python3 my_script.py deploy 1250 0.0 0.3 bash当前全部进程会被 ps aux 一次性打印出来, 看过一眼后就离开了。要是想要一个, 能够实时刷新, 还能看到进程占用发生变化的界面, 那就使用:top居于首位持续更新展示着此刻占用中央处理器最高的那个进程会排位在最前面, 按下q予以退出。这个被称作命令的东西会成为你当察觉“当前系统内部究竟处于何种忙碌状态”时的首个反应, 是值得牢牢记住的。三、前台和后台终端被占用是怎么回事重回起始的那个场景情形, 为何在运行一个程序之后, 终端居然就已经被“占住”了, 无论输入任何内容均没有反应呢?由于当你运行.py时, 此命令按照默认会在前台运行, 终端会一直“专心等待”该进程全部执行完毕, 之后才会再将控制权交还给你, 故而你所敲入的内容均无法进入。你若想令程序能够于后台悄然地运行, 终端便会即刻归还给你以供继续使用, 于命令的末尾添加上一个“”:python3 my_script.py 这样一来, 此程序将会于后台那种状态下运行, 紧接着终端马上就能够恢复到正常情形, 此时此刻你能够再次去敲击那些别的命令。# 查看当前有哪些任务在后台运行 jobs如果程序已经在前台跑起来了忘了加 也有补救办法先按 CtrlZ ← 把当前程序暂停扔到后台去注意是暂停不是继续运行 然后敲 bg ← 让刚才暂停的程序在后台继续运行下去四、CtrlC 有时候管用有时候不管用为什么CtrlC乃新手最常运用用以“停止”的操作, 然而它并非每回都能够发生预期功效, 于此予以简要阐释, 对于更深入的相关原理, 在之前制作策划的系列中具备专题性讲解信号机制的一篇文章, 在此仅讲述最为基础的那部分内容啦。采取CtrlC这种行为, 从本质上来说, 是专门针对所在进程, 去发送一个“请你停下来”的请求, 而并非是要强行将其“物理消灭”, 是这样的情况。多数程序接收到此请求后, 会正常地停下并退出, 然而要是该程序卡在某个特殊状态下像是正在等待一个永远不会返回的网络响应, 或是程序自身编写存在问题, 忽略了这种请求, 那么CtrlC可能就没有反应, 进程会持续卡在那儿。此时此刻, 所需用具极更径直的办法, 即径直寻觅此进程的PID, 敕令其终止运行。五、kill结束一个进程先找到你想关掉的进程的 PIDps aux | grep my_scriptdeploy 1234 0.2 1.5 python3 my_script.py看到 PID 是 1234 用 kill 命令结束它kill 1234这个命令, 会先以“礼貌地”方式, 请求这个进程, 让其自己退出, 给它一个机会, 去做一些收尾工作, 比如把还没保存的数据写完。倘若像这般都没办法将其关闭掉, 也就是进程完全卡死, 并且毫无反应的状况下, 能够采用更为强硬的方式:kill -9 1234-9属于最强硬的终止某种方式, 会被系统直接将那个进程进行强制停止, 不会给予其任何作出反应的机会, 这是最后的一项手段, 正常状况下先采用不含-9的kill尝试一下, 实在不行时便再运用这个强制版本。要是你不打算每次都先借助ps去查找那个PID, 而后再执行kill操作, 那么能够直接依据名字来予以关闭。pkill my_script这一命令, 会自行寻觅, 名字当中含有特定字符的进程, 并且, 直接将其终止, 如此一来, 就规避了中间查找进程标识符的操作步骤。六、几个进程常见的疑惑一次讲清楚疑惑一关掉终端窗口里面运行的程序也会跟着关掉吗大多数情形之下, 确实如此——当终端窗口关闭之际, 会给处于其中运行的进程发出通知称“你应当结束了”, 进程一般会随之退出。假定你抱有期望某个程序即便在你执行对终端的关闭操作、甚至于将 SSH 连接予以断开之后, 依旧能够持续运行, 举例而言是运行时间颇长需要耗用很久时间方能完成运行的一种任务, 那么在此情形下能够借助 nohup 命令:nohup python3 my_script.py 这样即使你关掉终端这个程序也会继续在后台运行下去。疑惑二同一个程序可以同时开好几个吗行得通。恰似先前讲过的那种类比, 同一款菜谱能够在同一时间有好些厨师去做, 同一个程序能够在同一时间开启好多独立的进程, 每一个都有着自身的 PID, 彼此之间不会相互干扰。疑惑三进程和应用程序是一回事吗并不全然如此。部分应用程序, 特别是那些相对复杂些的软件, 在运转之时会一同生成好几个进程来协同工作。举例而言, 当浏览器开启一个网页时, 或许会启动一个主进程以及好几个负责各异标签页的子进程, 要是你打开ps aux, 就会瞧见不止一个进程的名字都和这款软件存在关联。七、把今天的内容串起来实际操作一遍# 第一步启动一个会一直运行的小程序放到后台 sleep 300 # sleep 300 的意思是什么都不做就等待 300 秒很适合用来练手 # 第二步确认它在后台运行 jobs # 第三步用 ps 找到它的 PID ps aux | grep sleep # 第四步用 top 看一眼系统里现在正在跑的进程 top # 看完按 q 退出 # 第五步用 kill 把这个练习用的进程结束掉 kill 上一步看到的PID # 第六步确认它真的没了 ps aux | grep sleep跟随着去敲上一遍, 你就会对于“进程从启动开始、历经查看, 再最后到结束”这样子完整的一整套流程, 产生出一种极其直观的感受来。八、今天的内容一张表记住命令干什么用的ps aux看现在系统里都在跑什么进程top实时刷新查看进程占用情况按 q 退出让命令在后台运行不占用终端jobs查看当前有哪些后台任务CtrlZ把前台正在跑的程序暂停扔到后台bg让刚才暂停的程序继续在后台运行kill PID礼貌地请求某个进程结束kill -9 PID强制终止一个卡死没反应的进程pkill 名字直接按名字关闭进程不用先查 PIDnohup 让程序在关闭终端后依然继续运行写在最后在运行着的程序, 这一极为简单之事, 便是进程, 每个进程皆有着自身独一无二的编号, 也就是 PID, 它能够于前台运行, 即占据着终端, 亦能够于后台运行, 如此一来终端便还能够去做别的事情, 而当迫切需要将其停止之际, 首先应当以礼貌的方式使用 kill 进行操作, 倘若事态实在无法通过此种方式解决, 那么方可运用高达 -9 的操作来实施强制结束行为。理解这几个基本概念之后, 当你往后碰到“程序卡住了”这种情况, 以及“终端被占用了”这种情况, 还有“关不掉怎么办”这种情况时就不会再度不知所措, 晓得该去敲哪一条命令用以查看, 该去敲哪一条命令用以处理了。