我为其他进程写入了一个命名管道,并希望检查其他进程是否正确启动,但是不知道它的PID.上下文在屏幕上运行命令,确保命令正确启动.我希望这可行:
mkfifo /tmp/foo
echo hello > /tmp/foo &
lsof /tmp/foo
Run Code Online (Sandbox Code Playgroud)
可悲的是,lsof没有报道echo.inotifywait可能是另一个选项,但并不总是安装,我真的只想轮询一次,而不是阻止直到某个事件.
有没有办法检查命名管道是否打开写入?一般都开放吗?
更新:
一旦两端连接lsof似乎工作.这实际上解决了我的问题,但是为了这个问题,我有兴趣知道是否有可能在没有阅读器的情况下检测到命名管道的初始重定向.
> mkfifo /tmp/foo
> yes > /tmp/foo &
> lsof /tmp/foo
> cat /tmp/foo > /dev/null &
> lsof /tmp/foo
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
yes 16915 user 1w FIFO 8,18 0t0 16660270 /tmp/foo
cat 16950 user 3r FIFO 8,18 0t0 16660270 /tmp/foo
Run Code Online (Sandbox Code Playgroud) 我在运行Mac OS X 10.5的盒子上列出了一个进程(一个守护进程)的打开文件:
>lsof -p 89
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
...
xxxxx 89 xxxxxxxx 9u unix 0x34f8990 0t0 ->0x34f8880
Run Code Online (Sandbox Code Playgroud)
我想找到一种方法来打开这个套接字并写入它.(这次是我的痴迷......)
如何找到底层文件的索引节点/名称以便到达该套接字?有没有办法从shell脚本以编程方式解决此地址0x34f888 ?如果不是这样,如何以编程方式进行?
作为评论,我已经启动了netstat命令并得到了这个结果:
> netstat -u
Active LOCAL (UNIX) domain sockets
Address Type Recv-Q Send-Q Inode Conn Refs Nextref Addr
...
34f8990 stream 0 0 0 34f8880 0 0
...
34f8880 stream 0 0 0 34f8990 0 0
...
Run Code Online (Sandbox Code Playgroud)
我不是网络/套接字大师.希望这可以提供更多信息
在linux中,我使用lsof来检查文件是由哪个进程打开的.我有一个Android设备,但没有lsof命令.是否有可能找到打开特定文件的进程?
我将使用它来验证MediaPlayer是否持有fd,但应该关闭它.
我正在尝试使用lsof打开单个文件.有比这更快的方法吗?
$result = exec('lsof | grep filename | wc -l');
if($result > 0) {
//file is open
}
Run Code Online (Sandbox Code Playgroud)
我认为如果你知道文件名,他们必须是一种只测试一个文件的方法.我真正需要的只是真或假.
lsof 是一个很好的Unix工具,显示所有当前打开的文件句柄.
有没有人知道一个类似的工具,可以在运行的JVM中显示所有打开的文件(通过JVMTI或任何类似的界面)?
在这种特殊情况下,只要知道哪个类有句柄打开就足够了.方法/行甚至整个链到GC根目录都很棒,但处理程序所有者类已经是一个好的开始.
我知道我可以进行堆转储,在分析器中打开并找到它,但这是一项繁琐的工作,特别是对于大堆.
有人知道在 Java 中列出当前打开的文件描述符的方法以及打开文件描述符的数量限制吗?
迄今为止我发现的最好的是https://gist.github.com/jtai/5408684,它可以让我打印 Unix FD 系统最大值以及当前打开描述符的数量。我还没有找到一种纯 Java 方式来列出实际打开的文件的路径/名称。我还没有找到一种纯 Java 方法来列出每个进程对打开文件描述符数量的限制。
我主要对 Solaris 和 Linux 平台感兴趣,但纯 java 比必须执行某些东西要好。我知道我可以使用 pfiles(在 Solaris 上)、lsof(在 Linux 上)和 ulimit(在两者上),但我正在寻找更好的东西。
编辑 1:我主要关心当前进程/jvm 的打开描述符的数量以及该 jvm 的限制。系统范围的统计数据和限制也是一个加分项。
我有一个自定义管道,在 gstreamer 简写中看起来大致如下:
gst-launch-1.0 rtspsrc location=rtsp://<url-for-stream> ! rtph264depay ! h264parse ! imxvpudec ! *any-sink*
Run Code Online (Sandbox Code Playgroud)
这种类型的管道在 gst-launch-1.0 中工作得很好,因为它不需要正确地自行清理,但我需要使用直接 GST API 在我的 C++ 应用程序中使用它。这意味着我使用myPipeline = gst_pipeline_new("custom-pipeline"),然后按名称分配每个插件,链接它们,然后运行管道。我后来有一个要求停止管道并调用gst_object_unref(myPipeline). 执行此操作时,我观察到文件描述符被遗忘。后来我需要重新启动管道,因此泄漏情况更加严重。这种情况需要经常发生,以至于泄漏的描述符给了我一个例外:
GLib-ERROR **: Creating pipes for GWakeup: Too many open files
lsof我可以用...分析打开的文件
lsof +E -aUc myGstApplication
lsof: netlink UNIX socket msg peer info error
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
myGstApplication 5943 root 3u unix 0xabfb6c00 0t0 11200335 type=STREAM
myGstApplication …Run Code Online (Sandbox Code Playgroud) /path/to/dir我正在尝试使用该命令删除目录rm -rf。不幸的是我得到了错误
rm: cannot remove '/path/to/dir/.nfsdda293a660f276ca0000000a': Device or resource busy
Run Code Online (Sandbox Code Playgroud)
经过一番研究后,我意识到我需要找到哪个进程正在使用该文件,然后才能删除它:
lsof /path/to/dir/.nfsdda293a660f276ca0000000a
Run Code Online (Sandbox Code Playgroud)
这将返回与进程关联的 PID:
COMMAND PID
python 28594
Run Code Online (Sandbox Code Playgroud)
然后我杀死 PID 并再次尝试删除,但我仍然收到最初的错误。
如何强制/path/to/dir脚本内的脚本自动删除,无需人工干预?
我运行了该命令sudo lsof -i -n -P | grep TCP,想知道是否可以获得有关其输出的更多说明。
具体来说,在这张图片中:

为什么我有一个 IP:PORT 指向另一个 IP:PORT,然后又返回到自身并带有标签“ESTABLISHED”?我对这到底意味着什么感到困惑。