-
#!/bin/sh
-
-
-
POSTGRES_PREFIX="XXXXXX/base"
-
DB_NAME="XXXDB"
-
-
usage()
-
{
-
echo -e " USAGE: lsofrel PID [FD]"
-
echo -e " OUTPUT: FD\tfilename\tOID\trelation"
-
}
-
-
-
show_rel()
-
{
-
local pid=$1
-
local target_fd=$2
-
DB_DIR=`oid2name |grep $DB_NAME |awk '{print $1}'`
-
DB_PREFIX="$POSTGRES_PREFIX/$DB_DIR/"
-
filelist=`lsof -p $pid |grep $DB_PREFIX |grep REG|grep -v fsm|grep -v vm| awk 'BEGIN{OFS="|"}{print $4,$9}' `
-
-
for pair in $filelist
-
do
-
-
fd=` echo $pair |awk -F'[|]' '{print $1}'|tr -d u `
-
if [ -z "$target_fd" -o "$fd" = "$target_fd" ]
-
then
-
file=`echo $pair |awk -F'[|]' '{print $2}' `
-
file_p=`basename $file`
-
echo -e "$fd\t$file\t\c"
-
oid2name -d $DB_NAME -f $file_p |awk '{if(NR==4) print}'
-
fi
-
done
-
-
}
-
if [ $# -lt 1 ]
-
then
-
usage
-
exit
-
else
-
show_rel $1 $2
- fi

因为截图是用的公司的数据库,为了信息安全我只显示了系统表(grep pg),并且将数据库存储路径做了处理。该脚本接受1到2个参数,第一个参数是进程ID,第二个参数是进程打开的的FD,如果存在的话。只有一个参数,会显示该进程打开的所有relation。有两个参数会显示该进程某FD对应的路径及relation。比较简单,如上图所示。如果SQL大量磁盘IO操作的话,配合strace,可以看到SQL在读那个relation的记录。