我已经在我们的ERP系统中编写了一个函数,它通过简单的"回显"将日志写入服务器上的文件。它到日志文件。
echo "SOME LOGDATA" >> /users/erp/log/LOGMSG
每次用户触发特定事件时,都会调用LOG函数。
如果两个用户同时触发LOG事件会怎样?
" echo"照顾文件锁? 在我看来,它必须是Linux内核或bash必须小心,文件不是由2个命令行指令同时写入。
我写了一个测试用例来强制这个条件(一秒钟内大约1000个LOG调用)似乎我的想法是正确的,但我不能确定,这些调用是在bash上同时执行的。 / p>
答案 0 :(得分:4)
正如here所解释的,只有当编写的序列短于PIPE_BUF
的较小值和stdout缓冲区的大小(很可能是BUFSIZ
)时,才能保证echo是原子的。
对于较长的序列,您需要锁定。使用可以使用lockfile-create
和lockfile-check
。
答案 1 :(得分: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行。
答案 2 :(得分:1)
小心不要重新发明轮子,在* nix系统中有syslog以正确的方式处理日志记录。 echo
对文件的问题在于您可以强制执行互斥,但最困难的部分是处理序列化,一个echo
在另一个之前写入的事实并不意味着记录的操作实际上先执行(也不是平行的)。