我的crontab工作出了点奇怪的问题。我的crontab作业执行以下操作:
program > file然而,有时文件中充满了我无法解释的随机数据。
我想知道是不是以前的crontab作业运行时间较长,并且以某种方式将其在file中的结果与当前的crontab作业混合在一起?
总的来说,我的问题是:>操作是原子的吗?这意味着如果两个程序执行> file,那么最后一个完成的程序将以file格式存储其数据
发布于 2015-08-19 00:15:00
不,它不是原子的。一点都不是原子的。
重定向做两件事:
然后,启动该实用程序,并将其stdin分配给打开的文件。
如果两个脚本或多或少同时这样做,它们最终都会写入同一个文件,但由于它们将具有独立的文件描述符,因此每个进程将覆盖另一个进程的输出,从而导致大量字节的交错,其中一些来自一个进程,另一些来自另一个进程。
另一个常见的争用情况与文件在实用程序开始执行之前被截断(被shell)的事实有关。因此,即使该实用程序只向文件写入一行,读取该文件的并发实用程序也可能会发现它是空的。
发布于 2015-08-19 00:15:17
它不是原子的。您可以自己轻松地进行验证:
( { echo a ; sleep 3; echo b ; } > 1) &
( { echo c ; sleep 1 ; echo d ; } > 1 )&
sleep 5 ; cat 1发布于 2015-08-19 00:18:31
bash >是使用带有标志(至少对于bash 4.3.30 ) O_TRUNC | O_WRONLY | O_CREAT (来自make_cmd.c的第707行)的open完成的。
因此,每个都会截断文件,并向其写入。如果前一个进程仍然具有打开的文件句柄,它将继续写入文件,并在其查找位置写入文件,而不知道另一个进程已截断该文件。
https://stackoverflow.com/questions/32077127
复制相似问题