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


21

我对bash脚本非常陌生,因此我可能会拨错树,但这是我目前的情况:

在脚本中,我开始soffice;将odt转换为pdf

似乎soffice使自己脱离了脚本的过程,并徘徊去做自己的事情。GUI应用程序倾向于这样做...

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

(据我所知)我无法使用Soffice的进程ID,因为在脚本开始之前它可能已经是一个正在运行的进程。对于其他不相关的文档/演示文稿/电子表格,常规的GUI活动可能已经打开办公室

对我而言,问题的关键在于,在我继续之前,必须完成新pdf的撰写...

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

Answers:


25

您可以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"

在进程“ pyhton3.2”打开文件“ test.py”的同时运行。文件关闭后,它将继续执行“ echo done”并退出。

我在其中放置了“ sleep 0.5”,这样循环就不会严重占用CPU。否则,它将使用100%cpu。

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

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


将其包装到一个直到循环中,您已经达成协议。
尼克·帕斯奇奇

做到了。:-)我希望它不是可怕的样式-不必费心阅读最佳实践。无论如何,它运作良好。
Stefano Palazzo

谢谢Stefano ...是的,它确实起作用了...所以它是一个正确而正确的答案。.旁注,它突出显示了办公室中发生的事情不是我所想的..似乎是一个临时文件正在创建并且最终文件在完成时被(可能/可能)重命名了...所以我现在正在研究...在这种情况下,我可能只需要等待它的*存在 ... ...并感谢您在unoconv上的链接..我将对其进行研究。(总体而言,我将.pdf转换为多个..jpegs,每页一个)
Peter.O 2010年

@ fred.bear等到文件存在后,将if语句替换为:if [ -f test.odf ]。(bash脚本有时可能如此神秘……)
Stefano Palazzo

6
尝试lsof -- /path/to/file避免使用grep'ing
RubyTuesdayDONO 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.