4

У меня есть небольшая проблема.

У меня есть файл, размещенный на удаленном сервере (http://mywebsite/file.zip). У меня также есть несколько встроенных Linux-боксов (под управлением openelec OS). Боксы имеют довольно ограниченные команды, но у них все еще есть основные - curl, bash и т.д. На всех них хранится файл (/storage/file.zip)

То, что я пытаюсь сделать - мне нужно настроить скрипт, который выполняется в первую минуту после полной загрузки устройства, и он, вероятно, будет использовать curl, чтобы проверить, является ли файл удаленного сервера (mywebsite/file.zip) новее, чем локальный (/storage/file.zip), и вместо того, чтобы загружать его, если он новее, - необходимо выполнить скрипт bash (/storage/scripts/script.sh)

Я обычно использую эту команду "curl -o /storage/file.zip -z /storage/file.zip http://website/file.zip ", но я не знаю, как заставить его выполнить сценарий вместо загрузки файл. Даже не уверен, возможно ли это вообще.

Вся помощь очень ценится!

Кроме того, просто чтобы убедиться - он должен выполняться, только если localfile старше, чем remotefile. Если localfile новее, чем remotefile - ему не нужно выполнять сценарий, поскольку выполняемый сценарий также загружает удаленный файл с сервера, следовательно, после его выполнения - localfile будет с более новой отметкой времени, которая, если не указано, что скрипт выполняется только на удаленном файле новее - он может закончиться бесконечным циклом.

2 ответа2

4

Вместо того, чтобы смотреть на имя файла, вы можете доверять вашему HTTP-серверу, чтобы он сообщал вам, когда в последний раз файл был изменен, и действовать соответствующим образом.

#!/bin/bash

remote_file="http://mywebsite/file.zip"
local_file="/storage/file.zip"

modified=$(curl --silent --head $remote_file | \
             awk '/^Last-Modified/{print $0}' | \
             sed 's/^Last-Modified: //')
remote_ctime=$(date --date="$modified" +%s)
local_ctime=$(stat -c %z "$local_file")
local_ctime=$(date --date="$local_ctime" +%s)

[ $local_ctime -lt $remote_ctime ] && /storage/scripts/script.sh

# end of file.
0

Другой ответ был хорош для обычного Linux, но не работал для OpenELEC. Поэтому я решил вместо этого сравнить по размеру, и это работает как шарм! Вот код:

#!/bin/bash
Local=$(wc -c < file.zip)
Remote=$(curl -sI http://server/file.zip | awk '/Content-Length/ {sub("\r",""); print $2}')
if [ $Local != $Remote ]; then
/bin/bash /storage/scripts/script.sh
else
echo "Same size."
fi

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .