Есть ли механизм мьютекса / семафора в сценариях оболочки? - PullRequest
26 голосов
/ 29 июля 2011

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

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

Ответы [ 3 ]

39 голосов
/ 17 апреля 2012

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

mkdir потерпит неудачу, если каталог существует, и сделает это, если его нет. Это атомарная операция, и вы можете использовать ее примерно так, чтобы сделать мьютекс в вашем сценарии оболочки (из приведенного выше 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

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

13 голосов
/ 29 июля 2011

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

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

Существует множество вопросов / ответов по этой теме, опубликованных здесь уже на SO

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

6 голосов
/ 19 мая 2018

Вы можете использовать утилиту 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

(

В ответ на вопрос massimo :

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

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

)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...