观察.tar文件的变化,如果是,则提取,构建和运行

时间:2012-02-10 19:31:52

标签: bash makefile tar sh

我正在尝试查看tar文件以进行更改,如果是,请提取文件,cd进入目录,然后构建,然后运行。

我所拥有的内容如下:

while [ 1 ]
do
    checksum=`md5sum kinect.tar`
    sleep 10
    newsum=`md5sum kinect.tar`
    if [ $newsum -ne $checksum ]
    then
        killall lebron
        tar -zxf kinect.tar
        cd kinect
        make
        ./lebron &
    fi
done

我偶尔会在[ has too many arguments的行上遇到if错误,但我不确定原因。我有什么好吗?你会建议一个替代解决方案吗?

3 个答案:

答案 0 :(得分:1)

首先,您不引用您的变量。其次,-ne用于比较数字,而不是字符串。请改用!=

if [ "$newsum" != "$checksum" ]

正如Ed Heal在他的评论中指出的那样,如果文件被原子地修改,该算法才有意义。保证这一点的最佳方法是,如果它是在一个地方生成,然后移到kinect.tar。此外,如果在构建先前版本时修改了文件,则代码将无法捕获更改,这可以通过Ed Heal建议的以下更改来修复:

checksum=`md5sum kinect.tar`
while [ 1 ]
do
    sleep 10
    old_checksum=$checksum
    checksum=`md5sum kinect.tar`
    if [ "$old_checksum" != "$checksum" ]

真的,如果你有一个更好的方法来编写.tar文件来与你的脚本进行通信,那将是最好的。例如,新的.tar文件始终完全写入,然后移动到脚本检查的kinect-new.tar并移至kinect.tar。这避免了读取不完整文件的可能性和比较md5sums的混乱。 (你可能会更加漂亮并使用类似inotify-tools之类的内容来避免显式轮询,但这可能不值得付出努力。)

不幸的是,这并没有解决构建可能失败的问题(除非您使用的.tar文件是已知的良好版本,在这种情况下,您似乎不太可能想要每个都检查一个新版本10秒)。您可能想要创建一个目录,在那里解压缩,只有在make成功时才替换旧版本。有点像这样:

tar -zxf kinect.tar
cd kinect
if make
then
    cd ..
    rm -rf kinect.good
    mv kinect kinect.good
    cd kinect.good
    killall lebron
    ./lebron &
fi
cd .. # make sure we always stay in the original directory

答案 1 :(得分:1)

您的一个问题是md5sum会返回散列文件名。你只想捕获哈希值。您可以使用带有重定向和进程替换的read内置函数轻松完成此操作。

另外,既然你已经使用bash作为翻译,那么你真的应该使用[[ ]]而不是[ ]而且前者的能力要强得多。

#!/bin/bash

while true; do
    read checksum _ < <(md5sum kinect.tar)
    sleep 10
    read newsum _ < <(md5sum kinect.tar)
    if [[ $newsum != $checksum ]]; then
        killall lebron
        tar -zxf kinect.tar
        cd kinect
        make
        ./lebron &
    fi
done

答案 2 :(得分:0)

这是对上述@tekknolagi评论的回复 - 使用它来使响应更具可读性。

检查更新的脚本

checksum=`md5sum kinect.tar` 

    while [ 1 ] 

do 
    sleep 10 
    newsum=`md5sum kinect.tar` 
    if [ "$newsum" != "$checksum" ] 
    then 
       # Inform you that the file has changed (email perhaps).
    fi 

我假设您通过网络(FTP?)接收tar文件。如果是这样,请执行以下操作

1)FTP到不同的文件名 2)FTP小尺寸(1字节)表示FTP已完成 3)修改上面的脚本以检查步骤2收到的文件。如果找到,删除它(或者更好地重命名它以使您能够轻松恢复),删除旧的kinect.tar文件。将文件从步骤1移动到位

或者

1)FTP到不同的文件名 2)获取FTP以删除kinect.tar 3)获取FTP将文件从1)移动到位。