strace常用来跟踪进程执行时的系统调用和所接收的信号。你不仅可以调试一个新开始的程序,也可以调试一个已经在运行的程序(把strace绑定到一个已有的PID上 面)。
通用语法:
strace -o output.txt -T -tt -e trace=all -p 28979
上面的含义是 跟踪28979进程的所有系统调用(-e trace=all),并统计系统调用的花费时间,以及开始时间(并以可视化的时分秒格式显示),最后将记录结果存在output.txt文件里面。
root@ubuntu:/usr# strace cat /dev/ execve(, [, ], []) = brk() = access(, F_OK) = - ENOENT (No such file or directory) mmap(NULL, , PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -, ) = access(, R_OK) = - ENOENT (No such file or directory) ... brk() = brk() = fstat(, {st_mode=S_IFCHR|, st_rdev=makedev(, ), ...}) = open(, O_RDONLY) = fstat(, {st_mode=S_IFCHR|, st_rdev=makedev(, ), ...}) = read(, , ) = close() = close() = close() = exit_group() = ?
每一行都是一条系统调用,等号左边是系统调用的函数名及其参数,右边是该调用的返回值。
strace 显示这些调用的参数并返回符号形式的值。strace 从内核接收信息,而且不需要以任何特殊的方式来构建内核。
starce 的另一个用处是解决和动态库相关的问题。当对一个可执行文件运行ldd时,它会告诉你程序使用的动态库和找到动态库的位置。但是,ldd并不能把所有程序依赖的动态库列出来。
strace跟踪程序使用的底层系统调用,可输出系统调用被执行的时间点以及各个调用耗时;pstack工具对指定PID的进程输出函数调用栈。
strace + pstack + ldd
ssh:
/etc/ssh/sshd_config
PermitRootLogin no;
MaxStartups 10; #最大的未登录的联机画面数
service sshd restart
ssh user@hostname 'command_list' #ssh执行远程命令,command_list=ls;hostname;uptime;env
ssh user@hostname < script_name #ssh登录后执行本地的script_name
ssh user@hostname < script_name > local.out #ssh登录后执行本地的script_name
ssh user@hostname 'bash -s' < script_name para1 para 2#script_name有参数的话,要有-s选项,表示从standard input读入
ssh -t user@hostname 'ssh hostname_2' #ssh作为跳板隧道,-t表示伪终端,因为ssh hostname_2涉及到登录,需要有终端输入
cat batch.sh
#!/bin/bash
#############################################################
###Created by Danny Zhu
###usage:
###./batch.sh ipList.txt js.sh
###ipList.txt contains the ip list you need to connect to
###js.txt is a script file which will run on the target ip
###this bash script can only be performed one by one
###this bash script can not be peformed on ip in parallel
############################################################
ip_list=$1
js_file=$2
for ip in `cat $ip_list`
do
echo $ip
echo ""
sudo ssh -o StrictHostKeyChecking=no $ip 'bash -s' < $js_file
done
cat ipList.txt
10.102.142.57
10.102.142.58
10.102.142.59
10.102.142.60
10.102.142.61
10.102.142.45
10.102.142.44
10.102.142.43
10.102.142.42
10.102.142.41
10.102.142.40
10.102.142.39
cat js.sh
vgcreate datavg /dev/vdb
lvcreate -L 50G -n omsarchlv datavg
mkfs.ext3 /dev/datavg/omsarchlv
mkdir -p /omsarch
echo "/dev/datavg/omsarchlv /omsarch ext3 defaults 0 0" >> /etc/fstab
lvcreate -L 50G -n omsloglv datavg
mkfs.ext3 /dev/datavg/omsloglv
mkdir -p /omslog
echo "/dev/datavg/omsloglv /omslog ext3 defaults 0 0" >> /etc/fstab
lvcreate -L 1024G -n omsdatalv datavg
mkfs.ext3 /dev/datavg/omsdatalv
mkdir -p /omsdata
echo "/dev/datavg/omsdatalv /omsdata ext3 defaults 0 0" >> /etc/fstab
mount -a
df -lh