linux管道的执行顺序

最近有个疑问,netstat  -antup|head  -500   类似这条命令中,是netstat 执行完然后截取前500条记录还是,netstat 与head 并行执行,netstat 执行完500条就不再继续?

最终答案由酷学园darkdanger大大提供:

唔,我先前都沒有想過這個問題呢....
查了一下再加上一些驗證後
我想管線命令的執行狀況大概是這樣:
1.
管線命令會觸發一個緩衝區(buffer)的建立,讓不同程式從中讀取、寫入資料
2.
管線最末端的程式結束時會觸發緩衝區停止擴充
3.
管線前端的程式則會因為無法再寫入至緩衝區、發生錯誤而終止

測試程式:

代碼: [選擇]

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
p = 0

txt = open("log.txt", "w")

while p < int(sys.argv[1]):
    p = p + 1
    txt.write("%d\n" % p)
    print(p)

txt.close()

程式列印 1000 次,儘管 head 後只顯示 5,但 log.txt 仍寫入了 1000 行:

代碼: [選擇]

./pipe_test.py 1000 |head -5
程式列印 3000 次,出現 IOError,log.txt 內則寫入了 2680 行:

代碼: [選擇]

./pipe_test.py 3000 |head -5

代碼: [選擇]

IOError: [Errno 32] Broken pipe
若改寫成忽略 IOError:

代碼: [選擇]

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
p = 0

txt = open("log.txt", "w")

while p < int(sys.argv[1]):
    p = p + 1
    txt.write("%d\n" % p)

try:
        print(p)
    except IOError as error:
        pass

txt.close()

則 log.txt 可以順利寫入到 3000 行

时间: 2024-08-06 11:52:41

linux管道的执行顺序的相关文章

LINUX 笔记-命令执行顺序 &amp;&amp; ,||

&& 格式:命令1 && 命令2 说明:命令1返回真(即返回0,成功被执行)后,命令2才能够被执行 例:/apps/bin目录将会被移到/apps/dev/bin目录下,如果它没有被成功的执行,就不会删除/apps/bin目录 mv /apps/bin /apps/dev/bin && rm -r /apps/bin || 格式:命令1 || 命令2 说明:命令1未执行成功,那么就执行命令2 例: 拷贝文件没成功的话,就显示错误. cp word.txt w

Linux命令执行顺序— ||和&amp;&amp;和; 比较

Linux命令执行顺序— ||和&&和; command1 && command2: &&左边的command1执行成功(返回0表示成功)后,&&右边的command2才能被执行. command1 || command2: 如果||左边的command1执行失败(返回1表示失败),就执行&&右边的command2. command1;command2: 命令顺序执行 //第一个命令执行不成功,第二个命令才执行 [[email

linux命令类型及执行顺序

linux命令类型及执行顺序 一.命令分类 linux命令分为两类,具体为内部命令和外部命令 内部命令: 指shell内部集成的命令,此类命令无需人为安装,开机后自动运行在内存中,命令help查看所有内部命令的详情,如cd.type.echo.time.true等. 外部命令: 指通过外部介质安装的命令工具包,如通过yum.rpm等方式安装,具体安装路径在$PATH下. 命令查看: type查看命令分类,内部命令显示 shell相关信息,外部命令则显示$PATH路径,如下图: time属于内部命

Linux系统启动级别及顺序

Linux系统有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆运行级别2:多用户状态(没有NFS)运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式运行级别4:系统未使用,保留运行级别5:X11控制台,登陆后进入图形GUI模式运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动 运行级别的原理:1.在目录/etc/rc.d/init.d

Linux管道及IO重定向小练习

1.统计/usr/bin目录下的文件个数 [[email protected] ~]# ls /usr/bin | wc -l 1306 [[email protected] ~]# 2.取出当前系统上所有用户的SHELL,要求,每种SHELL只显示一次,并且按顺序进行显示 [[email protected] ~]# cut -d: -f7 /etc/passwd | sort -u /bin/bash /bin/nologin /bin/sync /bin/tcsh /sbin/halt /

Linux基础:Linux(BASH)命令执行和搜索机制

程序是如何被执行的? 当操作系统启动之后,就会等待用户操作.那么用户是如何与操作系统沟通呢?如何触发程序执行呢? 通常,与操作系统交互,有两种实现方式:CLI(command line interface); CUI(graphic user interface). 比如,当我们启动 windows系统,我们想看电影,听音乐,那么我们必须去触发程序的快捷方式,以启动程序. 同理,Linux要与kernel交互,必须通过一个shell的程序.Linux命令的执行必须依赖于Shell命令解释器.Sh

运行page页面时的事件执行顺序

运行page页面时的事件执行顺序 using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControl

解说asp.net core MVC 过滤器的执行顺序

asp.net core MVC 过滤器会在请求管道的各个阶段触发.同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等.以ActionFilter为例,我们来看看过滤器的触发顺序. 过滤器可注册范围 全局:将作用于所有请求的action controller:将作用于这个controller下的所有action action:作用于单个action 定义过滤器 全局 public class GlobalActionFilter : IAsyncActionFi

linux命令 环境设置 顺序

转 http://blog.csdn.net/dingxy/article/details/4016383 在登录Linux时要执行文件的过程如下: 在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile. ~/.bash_login或 ~/.profile文件中的其中一个, 执行的顺序为:~/.bash_profile. ~/.bash_login. ~/.profile. 如果 ~/.bash_profile文件存在的话,一般还