【发布时间】:2017-06-23 20:14:42
【问题描述】:
我已经为其他进程创建了一个命名管道来写入,并想检查其他进程是否正确启动,但不知道它的 PID。上下文是running a command in screen,确保命令正确启动。我希望这可能会奏效:
mkfifo /tmp/foo
echo hello > /tmp/foo &
lsof /tmp/foo
遗憾的是,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
【问题讨论】:
-
当你说“open for writing”时,你的意思是有数据可以读取吗?对您来说,什么是不可写入的 FIFO?
-
不是你要找的答案,但你可以写一个 .pid 文件
-
@Fred 如果您认为这个问题没有意义,也许“开放写作”是错误的术语。理想情况下,我希望列出重定向到该命名管道的进程。 IE。在
mkfifo之后,仅此而已,列表应该是空的。然后在yes > /tmp/foo之后,我应该在列表中看到yes的PID。 -
@我想澄清的是:您是在尝试确定编写器进程是否实际在写入,还是在尝试确定读者是否在实际阅读?
-
我认为@teppic 是对的,您可能正在尝试解决错误的问题。不过,这是一个有趣的问题。
标签: bash named-pipes lsof