【问题标题】:Alternative to lsof - to detect locked file替代 lsof - 检测锁定的文件
【发布时间】:2014-11-16 20:25:12
【问题描述】:

使用 fcntl(非阻塞)或某种自定义方式锁定文件。所以我正在使用 lsof 并检查进程的 pid 是否在那里。如果 lsof 返回空白,则表示没有使用它。

但是我脚本中的 lsof 需要 200 毫秒。

在 Windows 上,当我尝试测试文件是否被锁定时,我只需打开文件并在错误时将其锁定,这需要 5 毫秒。是否有任何替代 lsof 的方法来进行快速测试以查看是否有文件持有?

【问题讨论】:

  • 谢谢,我会检查一下并报告速度:)
  • 我将其添加为答案,如果它解决了您的问题,请告诉我。
  • lsof 默认尝试解析主机名。 lsof -n 没有,而且速度更快。
  • @Noitidart 我的评论只是关于为什么lsof 通常很慢的常见原因。无论如何,您应该在问题中包含您使用lsof 的命令行。我刚刚在一个终端中尝试了touch /tmp/locked ; flock /tmp/locked -c "sleep 120",在另一个终端中尝试了time lsof -F cl /tmp/locked。报告时间为 0.074 秒。 -F cl 要求以某种更容易从调用者脚本解析的方式输出命令名称和锁定状态。
  • 如果您的锁定时间较短(您在下面提到 30 毫秒),您可能应该放弃脚本并制作一个简单的 C 程序,或者重新考虑整点(也许 xyproblem.info 与此相关)。

标签: lsof


【解决方案1】:

fuser 命令是一个非常智能的 unix 实用程序,用于查找正在使用文件、目录或套接字的进程。它还提供有关拥有进程的用户和访问类型的信息。 READ MORE --digitalocean.com

要显示访问特定目录的进程,请使用:

fuser -uvm /somedir

以下输出显示,当以详细模式运行时,fuse 实用程序会提供有关 USER, PID, ACCESS and COMMAND 的信息

root@exampleuser-X55CR:~# fuser -v .
                     USER        PID ACCESS COMMAND
/root:               root       3378 ..c.. vim
                     root       3398 ..c.. bash
                     root       3449 ..c.. bash
                     root      19370 ..c.. bash

fuser 可用于识别打开特定文件的进程 ID。

lsof 有助于找出特定进程打开的所有文件。

有关 fuser 的更多选项,您可以查看他们的手册页 man fuser

这里有一些:

]$ fuser
No process specification given
Usage: fuser [ -a | -s | -c ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME...
             [ - ] [ -n SPACE ] [ -SIGNAL ] [ -kimuv ] NAME...
       fuser -l
       fuser -V
Show which processes use the named files, sockets, or filesystems.

    -a        display unused files too
    -c        mounted FS
    -f        silently ignored (for POSIX compatibility)
    -i        ask before killing (ignored without -k)
    -k        kill processes accessing the named file
    -l        list available signal names
    -m        show all processes using the named filesystems
    -n SPACE  search in this name space (file, udp, or tcp)
    -s        silent operation
    -SIGNAL   send this signal instead of SIGKILL
    -u        display user IDs
    -v        verbose output
    -V        display version information
    -4        search IPv4 sockets only
    -6        search IPv6 sockets only
    -         reset options

  udp/tcp names: [local_port][,[rmt_host][,[rmt_port]]]

【讨论】:

  • 这很棒,与lsof! 相比,它降低了 50 毫秒的速度。但是有什么更快的吗?它仍然需要超过 100 毫秒,并且依赖于此的功能在 30 毫秒内发生。
  • 同样出于好奇,是否有任何标志可以使 fuser 打印出进程名称,如 lsof。 Lsof 给出了一堆其他的废话,我只需要 pid 和进程名称 :) -v 没有用 :(
  • 你是不是这样用“fuser -v”。
  • 是的,先生,但它仍然不像 ps 的输出。我做了fuser -v "/home/noi/Desktop/rawr.txt" 这没什么大不了的。我想知道您是否也可以添加发布一些内容,以查看是否有某个 pid 使用它,但不必真正费心搜索任何信息并返回。我接受了答案。我试图在平均时间上达到 5 毫秒。我认为如此多的其他数据的影响导致了 150 毫秒的最大时间。
  • 我在将fuser 输出传送到其他命令(如 grep)时遇到问题。好像没有正常使用stdout。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-23
  • 2021-06-29
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多