2015-08-18 15 views
3

我有我的crontab作业奇怪的问题。我的crontab任务执行以下操作:bash>重定向原子?

program > file 

但有时候文件被充满了,我无法解释随机数据。

我不知道它是否可能是以前的crontab作业需要更长的时间运行,它以某种方式将其结果file与当前的crontab作业混合?

总的来说我的问题是:是>运算原子?意思是如果两个程序做> file,那么最后一个要完成的数据将在file

+0

如果你想简单地避免你的程序一次运行的两个实例,你可以使用'GNU并行',但调用它为'sem -id mySemaphore程序'来创建一个互斥信号类型的信号量。 –

+0

@MarkSetchell你的意思是我应该通过并行运行我的cron作业吗? – bodacydo

+0

http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Working-as-mutex-and-counting-semaphore –

回答

3

不,它不是原子的。甚至没有一点原子。

重定向做了两两件事:

  1. 它的名字打开文件,创造它,如果必要的。

  2. 它截断文件。

之后,实用程序启动,其stdin分配给打开的文件。

如果两个脚本同时或多或少地做了这些事情,它们最终都会写入相同的文件,但由于它们将具有独立的文件描述符,因此每个进程都会覆盖另一个进程的输出,从而产生较大的交织字节,一些来自一个进程,另一些来自另一个进程。

另一种常见的竞争条件与该实用程序在开始执行之前该文件被截断(由shell)相关。因此,即使该实用程序只向该文件写入一行,也可能是一个读取文件的并发实用程序将发现它是空的。

+0

感谢您的回答。那么如果两个进程同时写入同一个文件并覆盖其他输出,最终会发生什么?我会收到我描述的垃圾数据吗?或者它是否包含完成写入流程的最后一个流程的输出? – bodacydo

+2

@bodacydo:通常情况下,你会得到垃圾。每个进程都在自己的写入位置写入,而且这两个进程相对于彼此是异步的,所以您将从一个字节获取一些字节,并从另一个字节获取一些字节。如果你不幸,你甚至可以得到空白。 – rici

2

它不是原子的。您可以轻松地验证自己:

({ echo a ; sleep 3; echo b ; } > 1) & 
({ echo c ; sleep 1 ; echo d ; } > 1)& 

sleep 5 ; cat 1 
2

庆典>与一个open与标志(为庆典30年4月3日至少)O_TRUNC | O_WRONLY | O_CREAT(从make_cmd.c的707线)

所以每次必做截断该文件并写入它。如果以前的进程仍然有一个打开的文件句柄,它将继续写入,并且在文件的查找位置,不知道另一个进程已经截断了该文件。