在脚本中,如何确定文件当前是否正在被另一个进程写入?

Pet*_*r.O 23 bash openoffice.org process

我对 bash 脚本很陌生,所以我可能会吠错树,但这是我目前的情况:

在脚本中,我启动soffice;将odt转换为pdf

似乎soffice 将自己从脚本的进程中分离出来,然后徘徊去做自己的事情.. 好吧,那很好;GUI应用程序倾向于这样做......

但是,我需要等到新的pdf完全编写完毕,因为我的下一步涉及处理新的pdf

(据我所知)我不能使用 soffice 的进程 ID,因为在我的脚本开始之前它可能已经是一个正在运行的进程:例如。soffice可能已经为另一个不相关的文档/演示文稿/电子表格的正常 GUI 活动打开。

对我来说,问题的关键是,在我继续之前,必须完成新pdf的编写……

有什么方法可以确定文件何时不再以“写入”模式向另一个进程打开?...

Ste*_*zzo 26

您可以使用它lsof | grep /absolute/path/to/file.txt来查看文件是否已打开。如果文件已打开,此命令将返回状态 0,否则将返回 256 (1)。

请注意,此命令将花费一秒钟时间,因为通常随时都会打开大量文件。

lsof -c gedit例如,您还可以使用来查看 gedit 打开了哪个文件。将输出限制为一个进程会将执行时间减少到几乎为零。

这是一个等待的脚本:

#!/bin/bash

while :
do
    if ! [[ `lsof -c python3.2 | grep test.py` ]]
    then
        break
    fi
    sleep 0.5
done
echo "done"
Run Code Online (Sandbox Code Playgroud)

这会在进程“pyhton3.2”打开文件“test.py”时运行。一旦文件关闭,它就会移动到“echo done”并退出。

我已经把'sleep 0.5'放在那里,这样循环就不会那么严重地占用CPU。否则,它将使用 100% cpu。

奖金 似乎有一种简单的方法可以将 odt 转换为 pdf:

感谢 OOo 论坛上的 scls19fr 提供了这个可爱的提示。您可以使用命令行将 OpenOffice Writer 文件转换为 PDFunoconv -f pdf input.odt要获取 unoconv,只需sudo apt-get install unoconv在终端上运行即可 。 (rhyshale.wordpress.com 的rhyshale)

  • 尝试使用 `lsof -- /path/to/file` 来避免使用 `grep`'ing (6认同)