【问题标题】:Parallel writing to a file from multiple processes by using echo使用 echo 从多个进程并行写入文件
【发布时间】:2015-11-24 07:42:10
【问题描述】:

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

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

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

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

“回声”是否负责文件锁定? 在我看来,必须是 linux 内核或 bash 需要注意,一个文件不是由 2 个命令行指令同时写入的。

我写了一个测试用例来强制这个条件(一秒钟内大约 1000 次 LOG 调用),似乎我的想法是正确的,但我不能确定这些调用是在 bash 上同时执行的。

【问题讨论】:

  • 有什么理由不使用logger

标签: linux bash file-locking


【解决方案1】:

正如here 所解释的,只有在写入比PIPE_BUF 和标准输出缓冲区大小(很可能是BUFSIZ)更短的序列时,才能保证回显是原子的。

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

【讨论】:

    【解决方案2】:

    您可以将 GNU Parallel 用作互斥体/信号量,以确保一次只运行一个 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 行。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我知道系统日志。但据我所知,它将所有消息记录到 /var/log/message 这不是我的日志的合适位置。
      • 其实你可以根据进程名配置到任何你想记录的地方
      • 不知道可以配置。谢了。您可以在没有 root 权限或使用 sudo 的情况下以普通用户身份登录吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 2013-12-23
      相关资源
      最近更新 更多