vim多文件查找
在linux平台上,有很多优秀的shell命令组合来做多文件查找/替换,比如这些命令:find,sed,grep,awk,perl。但其他平台比如windows上就没那么方便了,这时候vim内置的多文件查找命令就有用武之地了,虽然比起外部命令来稍微慢了一点点儿。
这个vim内置命令就是vimgrep,有两种基本的使用方式:
1 | :vim\[grep\]\[!\] /{pattern}/\[g\]\[j\] {file} ... |
file部分支持通配符,代表当前目录,**代表当前目录及其子目录(递归),比如/.c代表当前目录下的c源程序文件,**/.c代表当前目录及其递归子目录下的所有源程序文件。file部分可以指定多次。
g(global)是全局标志,没有g,每行只会匹配一次,如果有g,则匹配行内所有符合的pattern,也就是行可以会多次被添加到quickfix列表。
j(jump)是跳转标志,没有j,vim会跳转到第一个匹配,如果有j,则只更新
以下命令查看匹配结果:
1 | :cn\[ext\] 下一个结果 |
更详细的用法参见:help vimgrep 和下面的refs。
References:
[1]使用vimgrep查找文件
[2]vi/vim使用进阶: 剑不离手 – quickfix
===
[erq]
Untitled Post - 87
uniq命令隔行重复是不认的,所以对于隔行重复的情况需要先用sort命令进行排序。
Untitled Post - 86
linux平台上virtualbox客户机如果需要访问主机的usb设备,则必须要将启动virtualbox主机的用户添加到vboxusers用户组。
debian jessie服务器安装时console-setup配置停滞
最近使用带有firmware的debian netinst安装一台服务器时,安装进度到99%配置console-setup时进程停滞了,没有当机,只是进度不动,几个小时都不带动的,一直在:
1 | configuring console-setup... |
CTRL+ALT+4查看安装日志,也没有错误提示,只是在等待。
重启进入rescue安装模式,在instaler环境下执行
1 | # dpkg --configure -a |
console-setup配置界面选择# american,安装时就是因为这里自动配置没过去,从而无限停滞了。
之后执行
1 | # grub-installer |
出现类似如下错误:
1 | Media change: please insert the disc labeled |
无果。
其实大部分包已经装完了,只是还没有安装grub,配置root用户和添加新用户而已。
所以使用rescuecd引导系统安装grub
这时候root是没密码的,无法正常登录,grub引导时选择recovery模式,顺利以root登录系统,然后执行passwd命令为root设置密码,之后再添加普通用户即可。
Untitled Post - 85
如果执行chroot时遇到这个错误,chroot: failed to run command `/bin/bash': Exec format error
,极有可能是因为两个环境的架构不一致,比如X86和AMD64。
RTL8723AU 蓝牙驱动
原来RTL8723AU芯片上的蓝牙功能驱动也已经有了,还是那个热心的Larry W. Finger搞的,github地址在https://github.com/lwfinger/rtl8723au_bt
安装也很简单:
1 | $ git clone https://github.com/lwfinger/rtl8723au_bt |
然后就可以了
UPDATE(08/01/2015):
hci_recv_fragment函数从kernel 3.18起被删除了,当前仓库的master分支尚未修改以支持此状况,但kernel分支已经支持。因此应该切换到kernel分支再行编译安装。
并且,模块的名字变成了btusb, so:
1 | $ git checkout kernel |
就可以了。
===
[erq]
查看JVM相关信息的命令与工具
jps
JVM版的ps命令,主要参数有:
- -l
输出完整的包名或者应用程序jar文件的全路径名 - -m
输出传给main方法的参数 - -v
输出传给JVM的参数
1 | $ sudo jps -lmv grep -v Jps |
jps命令的输出格式为:
1 | lvmid \[ \[ classname JARfilename "Unknown"\] \[ arg* \] \[ jvmarg* \] \] |
第一个列的lvmid是本地JVM标识符,同时也就是JVM进程的进程号。
jps命令只会输出当前执行命令的用户有权限访问的JVM进程信息。所以就是root也不一定能读取JVM进程信息,比如访问tomcat8的JVM信息要这样:
1 | $ sudo -u tomcat8 jps -lvm |
用root用户也看不到详细信息:
1 | $ sudo jps -lvm |
因为临时文件/tmp/hsperfdata_{user}/目录下的文件只有{user}才有存取权限。
jinfo
查看JVM的所有配置信息和命令行标志,还可以动态设置JVM的命令行标志参数。详细用法见jinfo(1)。
如果出现:
1 | pid: well-known file is not secure |
说明当前用户没有相应的权限,情使用与JVM进程相同的用户或者root用户再次尝试命令
如果出现:
1 | Exception in thread "main" java.io.IOException: Command failed in target VM |
说明不支持配置此参数。
jstat
JVM版的vmstat命令,JVM内存使用统计监控工具,可以监控各类内存使用量,也可以按时间间隔连续输出进行监控。详细用法参见jstat(1)和参考[1]
列如,查看VM内存中三代(young,old,perm)对象的使用和占用大小
1 | $ sudo jstat -gccapacity lvmid |
jmap
查看JVM中所有对象使用内存资源的详细情况,详细用法见jmap(1)
1 | jmap \[ option \] lvmid |
查看JVM堆使用情况
1 | $ sudo -u tomcat8 jmap -heap 4891 |
jstack
Java 栈追踪,用法详见jstack(1)
1 | jstack \[ option \] pid |
1 | $ sudo -u tomcat8 jstack 4891 |
jconsole
jconsole是JMX兼容的java监视和管理控制台。可以查看JVM上运行程序的性能和资源占用情况。
当使用jconsole监视本地程序时,jconsole与本地程序必须使用相同的用户运行,或者使用root,比如要监视tomcat运行:
1 | $ sudo -u tomcat7 jconsole <lvmid_for_tomcat> |
如果出现如下错误提示:
1 | No protocol specified |
这是因为用户tomcat7没有被授权访问本地显示服务器造成的,执行以下命令然后重新运行jconsole即可:
1 | $ xhost +local:all |
如果出现以下错误:
1 | $ sudo -u tomcat8 jconsole <lvmid_for_tomcat> |
是因为xauth授权的问题,因为tomcat8用户的主目录在/usr/share/tomcat8,但其主目录下并没有xauth授权文件.Xauthority文件,可以从登录用户的主目录下拷贝.Xauthority到tomcat8主目录,记得修改文件的属主和组为tomcat8,然后在重新执行命令就可以了。
注意:.Xauthority文件中的凭证会过期,每次登录其凭证都会更新。所以拷贝的办法只能临时用用,不能解决根本性的问题。
VisualVM
VisualVM是java的东家出品的、自由的性能分析和调优工具,基本上涵盖了以上几个命令行工具的功能。debian官方源里有对应的包VisualVM,也可以官网直接下载最新的zip包,解压缩后直接运行visualvm/bin/visualvm命令即可。这个工具更直观易用。
visualvm支持jmx和jstatd两种方式连接到远程jvm,jmx需要每jvm实例单独设置,而jstatd则可以连接系统范围内的所有jvm实例,无需单独设置。
jstatd配置
openjdk11内置jstatd,只要提供一个安全策略文件就可以直接运行,下面是一个可以运行的安全策略文件jstatd.all.policy
1 | grant codebase "jrt:/jdk.jstatd" { |
运行jstatd,如果需要连接到所有的jvm实例,则需要使用特权用户运行,如果只需要连接到特定用户的jvm实例,可以用对应的用户来运行:
1 | $ sudo jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=<ip_of_host> -J-Djava.rmi.server.logCalls=true |
默认监听在1099端口,默认创建的RMI名字为JStatRemoteHost,最后一个选项为启用调用日志,可以不要。
jstatd连接并不支持cpu监视,所以如果需要cpu监视的话可以使用jmx远程连接或者本地连接(可以通过ssh X11Forward在jvm所在机器本地运行VisualVM)。
References:
[1]jstat用法详解
[2]jstatd(1)
[3]Starting jstatd in Java 9+
[4]jvisualvm connect to remote jstatd not showing applications
[5]VisualVM shows “Not supported for this JVM”
内存溢出导致jenkins自动部署到tomcat失败
jenkins自动部署war到tomcat 7应用服务器时很不稳定,经常出现错误:
1 | ERROR: Publisher hudson.plugins.deploy.DeployPublisher aborted due to exception |
tomcat日志可以看到如下异常:
堆空间内存不足
1 | java.lang.OutOfMemoryError: Java heap space |
永久代内存不足
1 | SEVERE: Exception invoking method check |
出现此问题的原因是tomcat默认配置的堆和非堆内存都太小了,需要调整如下JVM内存配置参数:
- -Xms
初始堆内存大小 - -Xmx
最大堆内存大,一般设置-Xms与-Xmx一样大小,根据应用类型和物理内存大小来决定二者的大小 - -Xmn或者-XX:NewSize
堆内存中年轻代的大小 - -XX:PermSize
永久代内存的初始大小 - -XX:MaxPermSize
永久代内存的最大值
一般设置这几个参数也就够了,debian系统上tomcat 7 设置JVM的内存参数要在配置文件/etc/default/tomcat7中的JAVA_OPTS参数中设置。
一个web app,服务器物理内存16G,其设置如下:
1 | JAVA_OPTS="-Djava.awt.headless=true -Xmx5120m -Xms5120m -Xmn1024m -XX:PermSize=1024m -XX:MaxPermSize=1024m -XX:+UseConcMarkSweepGC" |
References:
[1]JVM系列一:JVM内存组成及分配
[2]JVM系列三:JVM参数设置、分析
[3]java.lang.OutOfMemoryError: Permgen space
===
[erq]
Mac OS X lsusb命令
mac os x上没有lsusb命令,可以使用如下命令列出系统usb设备信息:
1 | $ system_profiler SPUSBDataType |
也可以用brew安装第三方lsusb命令:
1 | $ brew update |
References:
[1]lsusb command for Mac OS X
===
[erq]