Подтвердить что ты не робот

Есть ли какой-либо механизм mutex/semaphore в сценариях оболочки?

Я ищу мьютекс/семафор/механизм параллелизма в сценарии оболочки. Рассмотрим следующую ситуацию: если пользователь "a" не закрыл общий файл, пользователь "b" не сможет его открыть/обновить. Мне просто интересно, как реализовать мьютекс, семафор, критические секции и т.д. В сценариях оболочки.

Какой самый простой способ реализовать механизм блокировки [уровень файла] в сценариях оболочки?

4b9b3361

Ответ 1

Смотрите BashFAQ и ProcessManagment для обсуждения блокировка файла в Bash.

Пометка вашего вопроса как оболочки (только) ограничивает количество людей, которые могут вам помочь. Вы можете добавить unix, ksh, Bash.

Есть многочисленные вопросы/ответы по этой теме, размещенные здесь уже на S.O.

Надеюсь, это поможет.

Ответ 2

BashFAQ отмеченный ракетом, имеет несколько хороших примеров. Основная идея, которую я перехожу сюда, чтобы страница была самодостаточной, заключается в том, чтобы использовать операцию, которая одновременно тестирует и устанавливает: mkdir

mkdir не удастся, если каталог существует и сделает это, если он не будет. Это атомная операция, и вы можете использовать ее так, чтобы сделать мьютекс в своей оболочке script (из приведенного выше BashFAQ)

# Bourne
lockdir=/tmp/myscript.lock
if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    # continue script
else    # failed to create the directory, presumably because it already exists
  echo >&2 "cannot acquire lock, giving up on $lockdir"
  exit 0
fi

перейдите по ссылке для получения более подробной информации об очистке и других элементах.

Ответ 3

Вы можете использовать утилиту flock для блокировки файла/использовать его как мьютекс.

Пример:

#!/bin/sh -eu
#advanced bash stuff not needed
: >> lock #create a file if it doesn't exist
{
flock 3 #lock file by filedescriptor

echo $$ working with lock
sleep 2
echo $$ done with lock

} 3<lock

Пример использования:

./mx & ./mx & ./mx & #will run one at a time cuz of the lock

(

В ответ на точку массимо:

Если вы не хотите жестко кодировать номер файлового дескриптора (это редко будет проблемой, если вы не жестко кодируете 0, 1 или 2, но в любом случае), тогда в bash (но не в оболочке только для POSIX) вы можете получить система выберет для вас fd:

{
flock $fd
#...
} {fd}<lock

)