tcpdump -A -s 10240 'tcp port 8080 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
Category Archives: linux
进程被debug时的状态
在mac/bsd和linux上ps展示进程状态的字符与linux可能含义不同,比如我的java进程在mac上ps看到是"TX+"状态
➜ ps aux | grep "[j]ava"
hongjiang 60387 0.0 0.4 6072548 36516 s001 TX+ 7:28PM 0:00.19 java Daemon
Linux上man ps看到 X 表示 "dead (should never be seen)", 而Mac/BSD下则是 “The process is being traced or debugged” 的含义。 Linux上当一个进程被debug中,状态跟stopped一样都使用T表示(在某些高版本linux内核里会区分开,使用小写t表示进程是被debugger跟踪)
通过strace查看一个进程的标准输出内容
线上某个业务java进程出了一些麻烦,去诊断的时候发现jstack无法输出,可能是jdk或os版本的问题。这时还可以尝试一下kill -3
,它默认会输出到进程的标准输出。如果不幸这个进程的标准输出被重定向到了 /dev/null
或者重定向到某个文件,但却因为很多其他日志也在大量的输出,导致日志文件过大,要从中找出线程栈相关的日志,还要耗点时间;这个时候,可以通过strace
来跟踪一个进程的标准输入。
strace
输出的信息需要一些处理,可以通过管道与其他命令组合(通过-o参数或-ff参数)
这里 -o 参数后边是一个字符串表示输出文件,如果字符串开头是一个"|"会被strace识别为管道
$ strace -f -e trace=write -e verbose=none -e write=1,2 -q -p $pid -o "| grep '^ |' | cut -c11-60 | sed -e 's/ //g' | xxd -r -p"
或者 -ff 参数,用管道与其他命令组合,注意strace的错误输出也要重定向
$ strace -ff -e trace=write -e write=1,2 -s 1024 -q -p $pid 2>&1 | cut -c11-60 | sed -e 's/ //g' | xxd -r -p
不过这两种方式都遇到一个问题,因为buffer的问题导致管道后边的命令没能完全处理strace跟踪到的数据(要等到后续的数据塞满buffer),有点像grep
需要--line-buffer
解决缓冲区问题,但不知道这里有什么方式,尝试过stdbuf
也没有解决。最后只能分两步,先把strace的内容输出到文件,然后再对内容解析:
$ strace -f -e trace=write -e write=1,2 -q -p $pid -o /tmp/slog
$ grep " |" /tmp/slog | cut -c11-60 | sed -e 's/ //g' | xxd -r -p
tmux下显示ssh目标host的问题
当在tmux下ssh到远程机器时,希望显示远程host,google后找到了一段对ssh封装过的函数:
ssh() {
if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]; then
tmux rename-window "$*"
command ssh "$@"
tmux set-window-option automatic-rename "on" 1>/dev/null
else
command ssh "$@"
fi
}
这段函数在我的mac上运行效果正常,如下图
但当我在一台linux上运行时,ctrl-d
退出远程ssh时,会一直卡在退出状态,不管ctrl-c
或什么操作也无法回到原bash,如下图
此时只通过tmux的kill-window的操作方式来关掉这个窗口,而在mac下是没有这个问题的,分析了一下,发现在我的mac上,tmux被oh-my-zsh给alias成了一个_zsh_tmux_plugin_run
函数:
➜ which ssh
ssh () {
if [ "$(ps -p $(ps -p $$ -o ppid=) -o comm=)" = "tmux" ]
then
_zsh_tmux_plugin_run rename-window "$*"
command ssh "$@"
_zsh_tmux_plugin_run set-window-option automatic-rename "on" 1>/dev/null
else
command ssh "$@"
fi
}
在_zsh_tmux_plugin_run
又做了一些环境变量的判断和处理,猜测可能是因为这些环境变量的差异所导致,先去掉tmux set-window-option automatic-rename "on"
这句最后对标准输出的重定向,看看输出什么信息,结果在修改之后却可以正常了:
还不太清楚为何这个重定向导致了ssh退出后没法回到原shell下,先记录下这个现象。