[转帖] shell管道咋堵住了

shell,管道,堵住 · 浏览次数 : 0

小编点评

**背景** 我们想开发一个小脚本,当CPU使用率过高时,使用jstack将java的线程栈保存下来,以便后面分析。获取CPU使用率可以比较容易,使用`vmstat`可以获取CPU空闲率,但第15列ID是CPU使用率,用100减一下,就是CPU使用率。于是,我使用如下命令获取了CPU使用率,发现能获取到: ``` vmstat 1 | awk '{print 100-$15}' ``` **问题** 但当我在后面再加一个脚本读取CPU使用率时,却发现当CPU到90%以上时,脚本半天都没有输出,如下: ``` let cpu_percentage=vmstat 1 | awk '{print 100-$15}' while read cpu; do [[ $cpu -gt 90 ]] && (jstack `pgrep java` > \"$(date +'%FT%T')_stack.log\"); done ``` **解决** 经过在网上一顿搜索,终于发现答案,原来是缓存的锅。当awk的输出目标是终端时,awk不会缓存数据立马输出,而当输出目标是文件或管道时,awk会缓存数据,到一定大小后再输出。并且,在awk中可以使用`fflush`函数,让其立即输出,因此,最终解决问题的方法是: ``` vmstat 1 | awk '{print 100-$15; fflush()}'|cat ```

正文

https://www.cnblogs.com/codelogs/p/16060378.html

 

背景#

起因是这样的,我们想开发一个小脚本,当cpu使用率过高时,使用jstack将java的线程栈保存下来,以便后面分析。

获取cpu使用率#

获取cpu使用率是比较容易的,使用vmstat就可以了,第15列id就是cpu空闲率,用100减一下,就是cpu使用率了。

于是,我使用如下命令获取了cpu使用率,发现能获取到,如下:

vmstat 1|awk '{print 100-$15}'

问题出现#

但当我在后面再加一个脚本读取cpu使用率时,却发现当cpu到90%以上时,脚本半天都没有输出,如下:

# 让一个核满载
stress --cpu 1

# cpu高时,自动jstack取线程栈
vmstat 1|awk '{print 100-$15}'|while read cpu; do [[ $cpu -gt 90 ]] && jstack `pgrep java`; done

我以为是我脚本的问题,于是把后面的脚本换成了cat,如下:

vmstat 1|awk '{print 100-$15}'|cat

发现还是没有输出,这就比较疑惑了,就好像最后那个管道被堵住了一样!

问题解决#

经过在网上一顿搜索,终于发现答案,原来是缓存的锅。当awk的输出目标是终端时,awk不会缓存数据立马输出,而当输出目标是文件或管道时,awk会缓存数据,到一定大小后再输出。

并且,在awk中可以使用fflush函数,让其立即输出,如下:

vmstat 1|awk '{print 100-$15; fflush()}'|cat

同样的,像grep, sed, python之类的命令,都有这样的问题,可如下避免:

grep --line-buffered
sed -u
python -u

另外,Linux专门提供了一个stdbuf命令,用来避免命令输出时缓存数据,用法如下:

stdbuf -o L grep

最后,我的小脚本修改如下,终于可以实现目标了。

vmstat 1|awk '{print 100-$15; fflush()}'|while read cpu; do [[ $cpu -gt 90 ]] && (jstack `pgrep java` > "$(date +'%FT%T')_stack.log"); done

往期内容#

这grep咋还不支持\d呢(BRE,ERE,PCRE)
原来awk真是神器啊
Linux文本命令技巧(上)
Linux文本命令技巧(下)
字符编码解惑

与[转帖] shell管道咋堵住了相似的内容:

[转帖] shell管道咋堵住了

https://www.cnblogs.com/codelogs/p/16060378.html 背景# 起因是这样的,我们想开发一个小脚本,当cpu使用率过高时,使用jstack将java的线程栈保存下来,以便后面分析。 获取cpu使用率# 获取cpu使用率是比较容易的,使用vmstat就可以了,

[转帖]命令行窗口下重复执行shell命令

1、命令操作录制和回放 #script -t 2> timing.log -a output.session # 开始录制 #scriptreplay timing.log output.session #回放 2、操作终端共享 通过管道来传输信息实现。需要一个pipe文件,并在需要展示的终端打开这

[转帖]关于 Shell 脚本的经典十三问

https://zhuanlan.zhihu.com/p/472862663 1、为何叫做 Shell? 我们知道计算机的运作离不开硬件,但却无法直接操作硬件,硬件的驱动只能通过一种称之为“操作系统(OS,Opertating System)的软件来管控。Linux 严格来说是一个操作系统(OS)。

[转帖]ESXi命令行shell下最常用的命令

https://forum.huawei.com/enterprise/zh/thread/580931293695328256 services.sh – Linux服务通常使用services命令管理,管理ESXi服务是通过使用services.sh命令实现的。Services.sh命令支持的参

[转帖]Linux基础命令---mysql

https://www.cnblogs.com/wj78080458/p/10848990.html mysql mysql是一个简单的sql shell,它可以用来管理mysql数据库。 此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、Fedora。 1、语法 mysql [

[转帖]40张图入门Linux——(前端够用,运维入门)

本文主要是Linux的入门内容,利用40张思维导图从基础、操作、实用指令、组管理和权限管理、crond任务调度、Linux磁盘分区和挂载、Linux网络环境配置、进程管理、服务管理、RPM和YUM、软件安装关键点、Shell编程共十二部分着手,从而系统的了解一下Linux(基于Centos),本文的

[转帖]sudo 命令_su、sudo、sudo su、sudo -i的用法和区别

sudo 命令 1、sudo 简介 sudo是linux系统管理指令,是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具,如halt,reboot,su等等。这样不仅减少了root用户的登录 和管理时间,同样也提高了安全性。sudo不是对shell的一个代替,它是面向每个命令的。(百

[转帖]shell带颜色的脚本

https://www.cnblogs.com/fengzi7314/p/14139319.html 我们在写shell脚本的时候为了使输出出来的信息更加醒目一点,可以给不同状态的字体显示不同的颜色,如下: 我在这里最先定义了2个函数,log.info和log.err,一个输出正常信息为绿色,一个输

[转帖]shell脚本循环查询数据库实现数据输出到csv

https://blog.csdn.net/m0_46897923/article/details/125906115?spm=1001.2014.3001.5501 可以利用这个思路高点事情吧.. 一、shell脚本和数据文件 1.shell脚本 cat data.txt|while read l

[转帖]shell 篇 用上今天分享的快捷键以后,我早下班了一小时

每次看着别人操作 shell 的时候,快捷键用得飞起,尤其是那个快速搜索历史命令,避免低效的↑↓键切换历史命令,很装逼有木有。。 废话不多说,下面是我整理的常用快捷键,真的可以提高自己的工作效率的,很不错!~ 一、常用快捷键小技巧 以下快捷键,都是一些常用的,记住这些命令,你的工作效率就会大大提升。