BASH: Безопасно ли, чтобы несколько bash фоновых процессов записывали в один и тот же файл? - PullRequest
2 голосов
/ 21 января 2020

Я пишу bash скрипт, который запускает несколько фоновых скриптов, которые все пишут в один и тот же файл. Мой сценарий выглядит так:

for (( COUNTER=0; ...)); do

    ./otherscript a b &

done
wait

и ./otherscript выглядит так:

echo $1 $2 >> file.txt

Это безопасно сделать? Потенциально могут быть запущены сотни этих сценариев в фоновом режиме, и они будут работать в системах Debian и Ubuntu.

1 Ответ

4 голосов
/ 21 января 2020

В POSIX-совместимой файловой системе (ext4, XFS и т. Д. c) в режиме O_APPEND (что дает вам >>), независимо от того, сколько у вас процессов, запись всегда будет go в дно; более того, , если эти записи помещаются на одной странице памяти, нет риска, что они будут разбиты на несколько отдельно добавляемых компонентов.

Таким образом, это небезопасно:

exec >>somefile   # redirects all future stdout to somefile in O_APPEND mode
printf %s 'Hello' # BUGGY: Writing less than a line, so you can get split at this point
echo ' World'

... и вот так:

exec >somefile     # truncate file and make all future writes go to it, NOT in O_APPEND mode
echo "Hello World" # BUGGY: Not opened with O_APPEND, so our file pointer may not be
                   # ...at the end after other programs have been doing concurrent writes.

... но это является безопасным:

exec >>somefile     # redirects all future stdout to somefile in O_APPEND mode
echo "Hello World"  # SAFE: Writing a complete line, less than 4kb, in O_APPEND mode.

Есть оговорка, что если Ваши записи больше, чем страница (обычно 4 КБ), они могут быть разделены на несколько системных вызовов, но оставьте их короткими и убедитесь, что каждая из них содержит полную запись, и вы в безопасности.

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