следите за изменениями в файле .tar, и, если это так, извлекайте, собирайте и запускайте - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь посмотреть файл tar на наличие изменений, и если он это делает, извлеките файлы, перейдите в каталог dir и соберите, а затем запустите.

Что я имею в виду:

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 ]

1 голос
/ 11 февраля 2012

Одна из ваших проблем заключается в том, что 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
1 голос
/ 10 февраля 2012

Во-первых, вы не цитируете свои переменные.Во-вторых, -ne для сравнения чисел, а не строк.Вместо этого используйте !=:

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

Как отметил Эд Хил в своем комментарии, алгоритм, возможно, имеет смысл, только если файл модифицируется атомарно.Лучший способ гарантировать это, если он генерируется в одном месте, а затем перемещается в kinect.tar.Кроме того, если файл был изменен во время сборки предыдущей версии, ваш код не будет перехватывать это изменение, которое может быть исправлено следующим изменением, предложенным Эд Хилом:

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
0 голосов
/ 11 февраля 2012

Это ответ на комментарий @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 

Я предполагаю, что вы получаете файл tar через сеть (FTP?). Если это так, сделайте следующее

1) FTP на другое имя файла 2) FTP небольшой размер (1 байт), чтобы указать, что FTP завершен 3) Измените приведенный выше скрипт, чтобы проверить наличие файла, полученного на шаге 2. Если он найден, удалите его (или лучше переименуйте, чтобы можно было легко восстановить), удалите старый файл kinect.tar. переместить файл с шага 1 на место

Или

1) FTP на другое имя файла 2) Получить FTP для удаления kinect.tar 3) Получите FTP, чтобы переместить файл с 1) на место.

...