/Articles

Linux如何优雅地输出Java线程堆

诊断Java线程问题时,一直要求提供客户Java的线程堆。大部分时间都在指导客户怎么抓数据,非常浪费时间。曾经写了一个非常方便的脚本,但是用户一般都会纠结于参数的选择,效果不明显。 有兴趣的可以使用我的脚本 ajs2.sh #!/bin/bash #-------------------------------------------------------------------------------- #- File name: ajs.sh - (A)uto (J)ava (S)tack #- Purpose: Collect Java Stacks...

file命令与magic查询原理

在给客户处理问题时候,用到了file命令,后来对file命令产生了兴趣,所以拿它和Java类文件的魔术判断做实验,这里记下一些实验的收货。 Java Class文件通过魔数来标识自身的编译版本。在Linux中,通过 xxd,可以看到十六进制头部信息。 $ xxd CookieExample.class | head -2 0000000: cafe babe 0000 0034 00ed 0a00 4400 7b08 .......4....D.{. 0000010: 007c 0b00 7d00 7e08 007f 0700 800a 0005 .|..}.~............

文件/文件夹权限的override

setUID / setGID setUID会让当前用户能够临时地以执行文件的拥有者的身份,相当于用高权限override了自己的低级权限。比如某个文件不允许被普通用户写操作(比如vi)、甚至不允许最基本的读操作(比如cat)。但是当root授予vi或者cat予setUID或者setGID后,当前用户就拥有了vi/cat拥有者的权限,具备了对文件的读写。 假设root用户创建了一个文本文件,并且只赋给 rwx------ 权限。 [root@localhost shell]# p2d.sh rwx------ permission = rwx------ binary =...

touch与文件时间

之前有个很诡异的问题,就是更新JAR压缩包中的class文件,会出现JAR文件本身的Last Modification Time保持不变的情况。这个问题到现在都没有找出原因,后来只能通过touch来人为修改。所以也顺便学习了一下touch的其他用法。 修改为指定的时间 假设有个file1的文件,它的时间信息显示为: $ stat file1 File: ‘file1’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fb00h/64256d...

用$*和$@读取全部参数的细节测试

写完用getopts处理全部的选项和参数后,我注意到了获取所有参数的特殊变量$@,要不要加双引号,对参数的处理有很大影响。另外linux还是有个也是读取所有参数的特殊变量$*,引用他们时,加不加双引号变化很大。索性一并测试一下,总结一下它们的规律特点,分别是: $* "$*" $@ "$@" $* 不加双引号:参数列表会被作为一个单词列表处理 加双引号:参数列表会被作为一个整体字符串 $@ 无论加不加双引号,行为都是一样。表现差异取决于参数列表本身有没有双引号。 参数列表整体没有双引号:参数列表会被作为一个单词列表处理...

用getopts处理全部的选项和参数

用getopts可以编写出像模像样的很规范的获取命令行参数/选项的参数。根据它的使用方法,命令参数列表存放在 optstring 中,变量名为name,后续还可以跟上参数。 getopts: usage: getopts optstring name [arg] 命令行的选项还分两种 带值的选项 不带值得选项(其实就是flag开关) 所以获取命令行需要处理三种数据 带值的选项 不带值得选项 参数列表 比如构造一段opt.sh,带值的选项有 -a -b -c, flag选项有 -x -y -z ,参数列表为 hello和world 执行opt.sh可能的情形为:...

权限转换的Shell脚本

使用chmod可以使用+,-或者=符号给u,g和o三组赋予权限。虽然字面上非常好理解,但是我还是最喜欢直接用八进制组一次性赋值。分享2个自己写的脚本,用来解析权限在字面和八进制之间的快速换算。 字面到八进制组的转换 命令方式为: p2o.sh permission_text 比如:p2o.sh rwxr-xr-- # p2o.sh # permission to octal # usage: p2o.sh rwxr-xr-- # author: jiechencn@qq.com permission=$1 for (( i=0; i<${#permission};...

标准输入和参数的管道传输

一个进程通过管道把自己的标准输出流作为标准输入流传输给第二个进程,这是最常用的。但是有时候第二个进程不支持接受标准输入流,只接受普通参数,这就需要对标准输入流做转换。 pipe 假设当前目录下有几个txt文件 $ find *.txt chinese.txt english.txt maths.txt name.txt 通过管道传输,find *.txt 的结果成为标准输出流,管道转换后,成为 grep 的标准输入流vvvv。这相当于把find的结果(多行字符串)作为输入流,传输给grep。所以grep对这个输入流(字符串)进行正则查找。 $ find *.txt | grep...

grep或sed快速定位大日志文件

客户的系统日志常常几个G以上,全部拿过来再分析的话网络传输非常耗时间,而且里面大部分日志都是很早之前的。介绍有两个非常简单好用又快速的方法,只截取大文件中有用的部分数据。 grep关键字的正则查询 我们总能知道一些错误日志的关键字。所以grep首先是最先想到。下面的过程就是怎么一步步优化grep命令,精确找到匹配项。 比如我们有个错误 “Node -1 does not exist in the cache”。找到它,很容易。 $ grep "^.\+Node -1 does not exist in the cache." stdout.log...

用Join像SQL Outer Join一样合并多文件

曾今处理过一个问题,帮助用户合并多个CSV文件,不需要编程(编程一定会涉及到又是循环又是匹配再填充),Linux下一个join命令,逐步调优,再重定向输出。 Shell一定是一个逐步调整优化的过程,没有人能完整记住所有参数 join命令的设计和SQL中的等值连接非常类似,默认它是一个自然联结。它支持: 默认:自然联结 - 以两个文件的第一列字段为key进行等值联结 inner join -a 1: 左外联结 left outer join -a 2: 右外联结 right outer join -a 1 -a 2: 全联结 full outer join...

cd目录的快速跳转

cd命令非常简单,日常使用其实也没有什么需要特别技巧的东西。但是下面的一些小技巧,非常有利于操作效率。 回到主目录 cd ~ 回到前一个访问过的目录 cd - 多次执行 'cd -',只会在当前目录和前一个目录中来回切换。 跨目录快速跳转 CDPATH环境变量为cd命令定义一个cd自己的查找目录。然后如果想要进入这个目录的子目录,可以直接 'cd 子目录',无论当前pwd是在哪个目录下。 比如,定义CDPATH的查找目录列表为:当前目录;主目录;/home/oracle/temp/p1/目录和/home/oracle/temp/p2/目录 export...

用/dev/null和/dev/zero更改文件

/dev/null的行为和/dev/zero看起来,有相反的作用,有时又相似。/dev/null就像无底洞,吃掉被指定的重定向。而/dev/zero能为目标文件提供连续的数据流填空。他们的作用可能还不止这些。但是我一般用它们做下面最常用的用途。 /dev/null清空文件 /dev/null常常用来吞掉被重定向的数据。反过来,它可以被当作输入流的空文件。 在分析系统故障时,日志文件会有大量的数据产生。重现问题的时候,首先过滤掉无用的信息,再比对时间戳信息。日志文件太大,非常不好处理。最好的方法是:使用/dev/null把日志文件清空(不删除)。 cat /dev/null...

1