Невозможно заставить работать bash flock

Главное - поставить ваши точечные файлы под контроль версий. Когда вы используете новую машину, проверьте их.

cd
git clone https://github.com/saterhater/home.git

Если на компьютере нет вашего инструмента контроля версий, вы можете хотя бы загрузить версию только для чтения. Github автоматизирует это; если вы используете другой хостинг, который не предоставляет такой возможности, сделайте создание zip-файла ловушкой фиксации.

cd
wget -O - https://github.com/saterhater/home/archive/master.zip | unzip -

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

  • Обязательно проверяйте свои файлы в старых версиях оболочек, а не только в тех, которые вы используете.Я сохраняю chroot со старыми выпусками Debian , чтобы получить ряд версий различного программного обеспечения (моя личная конфигурация в принципе должна работать с bash 1.14 и zsh 2.5, хотя я не использовал такие старые версии в течение многих лет. ).
  • Если вы полагаетесь на какую-либо необычную зависимость, зарегистрируйте ее в своей VCS или напишите какую-нибудь автоматизацию для ее загрузки.
  • Если вы хотите использовать какую-либо функцию, когда она есть, но сохранить запасной вариант, если он отсутствует, проверьте функцию, а не номер версии. Он более надежен (например, у некоторых систем может быть ночная сборка).

Вы можете делиться некоторыми вещами между bash и zsh, в основном псевдонимами и некоторыми функциями. Привязки клавиш и параметры подсказок не подлежат совместному использованию. Функции завершения Bash можно использовать с не древними версиями zsh. Если у вас есть код, который использует автоматическое разделение и подстановку переменных без кавычек, которые zsh не выполняет, вы можете запустить emulate -L ksh , чтобы заставить zsh переключиться в режим совместимости с ksh на время функция; make эмулирует псевдоним для : , если оболочка не zsh (вы можете проверить наличие переменной ZSH_VERSION ).

1
13.03.2018, 16:17
1 ответ

Рассмотрим этот пример на основе примера из справочной страницы flock:

#!/bin/bash

func() {
    echo "$$ trying to acquire lock"
    (
        flock -e 42
        echo "lock acquired by $$"
        sleep 10
    ) 42> /tmp/mylock
    echo "lock released by $$"
}

func

Теперь, если я запущу этот скрипт один раз:

$ bash ex.sh
22241 trying to acquire lock
lock acquired by 22241
lock released by 22241

Если я запускаю два экземпляра в течение этого 10 -секундного окна сна этого скрипта, первый в фоновом режиме, возможная последовательность событий:

$ bash ex.sh& bash ex.sh
[1] 24518
24519 trying to acquire lock
24518 trying to acquire lock
lock acquired by 24519
lock released by 24519
lock acquired by 24518
$
lock released by 24518

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

Я могу повысить шансы на то, что первый процесс выиграет гонку, введя задержку между их запуском:

$ bash ex.sh& sleep 1; bash ex.sh
[1] 30158
30158 trying to acquire lock
lock acquired by 30158
30179 trying to acquire lock
lock released by 30158
lock acquired by 30179
lock released by 30179
3
27.01.2020, 23:32

Теги

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