Linux 排查进程挂起【板砖~】

问题描述

 Linux 系统下;  进程突然挂起, 经过日志调试和跟踪,最后定位为 A进程进行日志打印时,fopen() 打开文件后,  进行了lockf(iNum,F_LOCK,00) 操作, 使用文件结束后-且没有 lockf( iNum, F_ULOCK, 00 ) ;  B进程 对相同文件进行读写操作时, 就会在fopen时 挂起;

需要kill A进程之后, B进程才会正常继续往下运行

lockf() 函数说明

#include <unistd.h>

int lockf(int fd, int cmd, off_t len);

fd为通过open返回的打开文件描述符。

cmd的取值为:

F_LOCK:给文件互斥加锁,若文件以被加锁,则会一直阻塞到锁被释放。

F_TLOCK:同F_LOCK,但若文件已被加锁,不会阻塞,而回返回错误。

F_ULOCK:解锁。

F_TEST:测试文件是否被上锁,若文件没被上锁则返回0,否则返回-1。

len:为从文件当前位置的起始要锁住的长度。

通过函数参数的功能,可以看出lockf只支持排他锁,不支持共享锁。

命令 1 strace -p [pid] 进行跟踪

可以通过该命令 ,跟踪程序的执行情况 ,再什么地方挂起;

命令2 lsof -p [pid] 进行查看

返回: COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

如果是 fopen–打开文件,则文件大小 显示在SIZE这一列;

解决办法

排查程序中 对于文件lockf() 锁定后,写完日志后 ,需要进行lockf() 进行解锁操作 ;

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值