使用 echo 从多个进程并行写入文件

Parallel writing to a file from multiple processes by using echo

我在我们的 ERP 系统中编写了一个函数,它通过简单地 "echoing" 将日志写入服务器上的文件。

echo "SOME LOGDATA" >> /users/erp/log/LOGMSG

每次用户触发特定事件时,都会调用 LOG 函数。

如果2个用户同时触发LOG事件会怎样?

"echo" 是否负责文件锁定? 在我看来,必须由 linux 内核或 bash 负责,一个文件不是由 2 个命令行指令同时写入的。

我写了一个测试用例来强制这个条件(一秒钟内大约 1000 个 LOG 调用),看来我的想法是正确的,但我不能确定,这些调用是在 bash.

here 所述,仅当写入的序列短于 PIPE_BUF 和 stdout 缓冲区的大小(最有可能 BUFSIZ ).

对于较长的序列,您需要锁定。使用可以使用lockfile-createlockfile-check.

注意不要重新发明轮子,在 *nix 系统中有 syslog 以正确的方式处理日志记录。 echo 对文件的问题是你可以强制互斥,但最难的部分是处理序列化,一个 echo 在另一个之前写入的事实并不意味着记录的操作实际上首先执行(也不并行)。

您可以使用 GNU Parallel 作为 mutex/semaphore 确保只有一个 echo 像这样同时运行:

sem --id mysem echo "System crashed"  >> log.txt

GNU Parallel 安装在大多数 Linux 发行版上,并且可以通过 homebrew.

轻松用于 OSX

您可以通过在两个或多个终端中的每一个中启动一个循环并让每个终端执行此操作来测试这个想法:

for i in {1..100}; do sem --id mysem echo hi >> log ; done

最后您会看到日志中每个终端恰好有 100 行。