strace 输出中 fcntl ... F_SETLK ... (资源暂时不可用) 的含义?

strace 输出中 fcntl ... F_SETLK ... (资源暂时不可用) 的含义?

当我在 Apache 上使用strace而它没有响应时,我得到以下输出:

[pid 13704] fcntl(57, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=1073741824, len=1}) = -1 EAGAIN (Resource temporarily unavailable)

这意味着什么?进程需要什么样的锁才能再次响应?

答案1

fcntl(57, F_SETLK, …)意味着该进程正在尝试锁定在文件描述符 57 上打开的文件。该错误EGAIN意味着锁定失败,因为它已被另一个进程占用。该锁具体位于文件中从偏移量 1073741824 到偏移量 1073741825 的部分。

在 Linux 上,您可以使用lslocks查看正在持有哪些锁。要找到谁拥有 Apache 正在等待的锁,您需要知道它所在的文件;lsof -p $pid会告诉你 fd 57 上打开了什么文件。

假设该进程需要锁才能继续,则在拥有锁的其他进程释放它之前,它不会做出响应。问题不是资源不可用且需要创建,而是现有资源当前正忙。

相关内容