![strace 输出中 fcntl ... F_SETLK ... (资源暂时不可用) 的含义?](https://linux22.com/image/111423/strace%20%E8%BE%93%E5%87%BA%E4%B8%AD%20fcntl%20...%20F_SETLK%20...%20(%E8%B5%84%E6%BA%90%E6%9A%82%E6%97%B6%E4%B8%8D%E5%8F%AF%E7%94%A8)%20%E7%9A%84%E5%90%AB%E4%B9%89%EF%BC%9F.png)
当我在 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 上打开了什么文件。
假设该进程需要锁才能继续,则在拥有锁的其他进程释放它之前,它不会做出响应。问题不是资源不可用且需要创建,而是现有资源当前正忙。