Параллельное осуществление программы на нескольких файлах

Хорошо, запустите этот скрипт с шаблоном как аргумент и если больше чем одно соответствие файлов он удалит самое старое, например:

$ ksh dtof.sh ?? # this will delete the oldest two-character file

Сценарий:

for i in "$@"; do
  if [ ! "$oldest" ]; then
    oldest="$i"
    continue
  fi
  if [ "$i" -ot "$oldest" ]; then
    oldest="$i"
    reap="$i"
  else
    reap="$oldest"
  fi
done
[ "$reap" ] && rm "$reap"
7
25.09.2017, 14:06
4 ответа

Это возможно и действительно происходит в действительности. Используйте файл блокировки для предотвращения этой ситуации. Пример, от упомянутой страницы:

if mkdir /var/lock/mylock; then
    echo "Locking succeeded" >&2
else
    echo "Lock failed - exit" >&2
    exit 1
fi

# ... program code ...

rmdir /var/lock/mylock
4
27.01.2020, 20:18
  • 1
    "Как в стороне, Вы почти определенно хотите заключить $file в кавычки". Это не было необходимо для моего простого задания, но очевидно Вашего права, которое будет лучше сделать так –  stefan 10.05.2012, 12:02
  • 2
    @stefan - я удалил его, после того как я видел, "игнорируют синтаксические ошибки"... :-) –  Chris Down 10.05.2012, 12:04
  • 3
    :D, это прекрасно подходит при напоминании мне об этом материале. Я склонен забывать это, так как я еще не привык к нему –  stefan 10.05.2012, 12:08
  • 4
    , я абсолютно ЛЮБЛЮ простоту mkdir-блокировки. Спасибо за ссылку! (даже при том, что я предпочел бы его читающий о нем на этом сайте, возможно, Вы хотите расширить свой ответ немного?) –  stefan 10.05.2012, 12:11

Два экземпляра Вашего сценария могут, конечно, взаимодействовать таким образом, заставляя команду работать дважды. Это называют состоянием состязания.

Один способ избежать этого состояния состязания состоял бы в том, если бы каждый экземпляр захватил свой входной файл путем перемещения его в другой каталог. Перемещение файла (в той же файловой системе) является атомарным. Перемещение входных файлов не может быть желательным, и это уже становится немного сложным.

mkdir staging-$$ making-$$
for input in folder/*; do
  name=${x#folder/}
  staging=staging-$$/$name
  output=making-$$/$name
  destination=done/$name
  if mv -- "$input" "$staging" 2>/dev/null; then
    bin/myProgram "$staging" >"$output"
    mv -- "$output" "$destination"
    mv -- "$staging" "$input"
  fi
done

Простым способом обработать файлы в параллели с помощью широко доступного инструмента является GNU, делают, с помощью -j флаг для параллельного выполнения. Вот make-файл для этой задачи (не забудьте использовать вкладки для расположения с отступом команд):

all: $(patsubst folder/%,done/%,$(wildcard folder/*))
done/%: folder/%
        ./bin/myProgram $< >$@.tmp
        mv $@.tmp $@

Выполненный make -j 3 выполнять 3 экземпляра параллельно.

См. также Четыре задачи параллельно..., как я делаю это?

2
27.01.2020, 20:18
  • 1
    за этот ответ. Если я мог бы принять два ответа, я был бы! –  stefan 11.05.2012, 13:42

У меня есть чувство, что Вы действительно пытаетесь выполнить несколько заданий параллельно и что файл блокировки является просто средством для конца.

Если у Вас есть Параллель GNU, http://www.gnu.org/software/parallel/ установил Вас, может сделать это:

parallel ./bin/myProgram ::: ./folder/*

Это выполнит myProgram на каждом ядре параллельно.

Можно установить Параллель GNU просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Посмотрите вводные видео для Параллели GNU для узнавания больше: https://www.youtube.com/playlist? list=PL284C9FF2488BC6D1

1
27.01.2020, 20:18

Проблема с блокировкой состоит в том, что Вам нужен метод, который создает блокировку, которая непрерываема (иногда названный atomar). Поскольку Chris имеет, записал в его ответе mkdir такая непрерываемая операция (создающий файл, не такая операция).

Существует также высокоуровневая команда - usally скрыта в procmail пакет: lockfile. Та команда имеет некоторые хорошие функции и может легко использоваться в Ваших собственных сценариях без потребности "изобрести велосипед" (например, запись Вашей собственной функции, которая блокирует на основе создания каталога).

0
27.01.2020, 20:18

Теги

Похожие вопросы