2012-03-08 34 views

回答

3

有几种方法来实现这一目标:

  • 如果可以,请从脚本启动该过程。当进程终止时,脚本将继续运行,这意味着它无法再向该文件写入更多数据。

  • 如果您无法控制进程但您知道进程在写入文件后终止,则可以找出进程标识,然后检查进程是否仍在运行kill -0 $PID。如果$?之后为0,则该过程仍然存在。

  • 如果这是不可能的,那么您可以使用lsof -np $PID来获取此进程的所有打开文件的列表,并检查您的文件是否在列表中。虽然这有点慢。

[编辑]注意,所有这些方法都是有点脆。正确的解决方案是让外部进程使用临时名称写入文件,然后在完成后立即对其进行重命名。

重命名确保每个人都可以看到整个文件的所有数据或没有。

+0

'! lsof -/path/to/file'? – RubyTuesdayDONO 2013-12-24 04:39:00

+0

@RubyTuesdayDONO:那呢? – 2014-01-08 09:27:44

+0

我认为它是一种更直接的方式来查询是否有任何进程打开该特定文件(与通过最可能进程打开的所有文件的列表进行“grep”打开)。你的第二个建议是在完成后重新命名临时文件,看起来像是一个更好的选择 - 我只想强调一下,'lsof'是一个复杂的命令,带有多个向量,用于准确地获取所需的信息。 – RubyTuesdayDONO 2014-01-09 01:19:20

2

简单的方法:让脚本执行程序并等待它完成。

1

这是不是很好,这让我觉得脏写它...... /tmp/foo.txt在文件正在测试...

#!/bin/bash 

until [ "$(find /proc/*/fd 2> /dev/null | 
    xargs -i{} readlink {} | 
    grep -c '^/tmp/foo.txt$')" == "0" ]; do 

    sleep 1; 
done; 
0

循环直到文件处于稳定状态的方法,如果你正在等待实验结果(所以你不需要实时事件处理)这应该工作:

EXPECTED_WRITE_INTERVAL_SECONDS=1 
FILE="file.txt" 
while : ; do 
     omod=$(stat -c %Y $FILE) 
     # echo "OLD: $omod" 
     sleep $EXPECTED_WRITE_INTERVAL_SECONDS 
     nmod=$(stat -c %Y $FILE) 
     # echo "NEW: $nmod" 
     if [ $omod == $nmod ] ; then 
       break 
     fi 
done 
1

创建使用inotify一个小的C程序。程序应该:

  1. 创建一个inotify实例。
  2. 为感兴趣的文件路径添加关于IN_CLOSE_WRITE事件的实例的手表。
  3. 等待事件发生。
  4. 使用适当的代码退出。

然后在您的脚本中,以文件路径作为参数调用该程序。

您可以通过添加一个超时参数来扩展它,并允许指定不同的事件。