是bash>;重定向原子?

是bash>;重定向原子?,bash,cron,crontab,atomic,io-redirection,Bash,Cron,Crontab,Atomic,Io Redirection,我的crontab工作有个奇怪的问题。我的crontab作业执行以下操作: program > file 然而,有时文件中会充满我无法解释的随机数据 我想知道是否是以前的crontab作业运行时间更长,并且它在文件中以某种方式将其结果与当前的crontab作业混合在一起 总的来说,我的问题是:操作是原子的吗?这意味着,如果两个程序执行>文件,那么最后一个要完成的程序将在文件?不,它不是原子的。一点原子都没有 重定向有两个功能: 它按名称打开文件,必要时创建文件 它会截断文件 然后,启动实

我的crontab工作有个奇怪的问题。我的crontab作业执行以下操作:

program > file
然而,有时文件中会充满我无法解释的随机数据

我想知道是否是以前的crontab作业运行时间更长,并且它在
文件中以某种方式将其结果与当前的crontab作业混合在一起


总的来说,我的问题是:
操作是原子的吗?这意味着,如果两个程序执行
>文件
,那么最后一个要完成的程序将在
文件

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

重定向有两个功能:

  • 它按名称打开文件,必要时创建文件

  • 它会截断文件

  • 然后,启动实用程序,并将其
    stdin
    分配给打开的文件

    如果两个脚本或多或少同时执行此操作,它们最终都将写入同一个文件,但由于它们将具有独立的文件描述符,每个进程将覆盖另一个进程的输出,从而导致字节的大交错,其中一些字节来自一个进程,另一些字节来自另一个进程


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

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

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

    bash
    是通过一个带有标志(至少对于bash 4.3.30)的
    打开来完成的(从make\u cmd.c的第707行开始)


    因此,每个文件都将截断该文件,并将其写入。如果前一个进程仍然有一个打开的文件句柄,它将继续写入,并在其查找位置写入该文件,而不知道另一个进程已截断该文件。

    谢谢您的回答。那么,如果两个进程同时写入同一个文件,并覆盖彼此的输出,最终会发生什么呢?我会得到我描述的垃圾数据吗?或者它会包含最后一个完成写入进程的进程的输出吗?@bodacydo:通常,您会得到垃圾。每个进程都在自己的写入位置写入,并且这两个进程彼此异步,因此您将从一个进程获取一些字节,从另一个进程获取一些字节。如果你运气不好,你甚至可以得到间隔。如果你想简单地避免同时运行两个程序实例,你可以使用
    GNU Parallel
    ,但作为
    sem--id mySemaphore程序调用它来生成互斥类型的信号量。@MarkSetchell你的意思是我应该通过Parallel运行我的cron作业吗?