2015-08-18 50 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線)

所以每次必做截斷該文件並寫入它。如果以前的進程仍然有一個打開的文件句柄,它將繼續寫入,並且在文件的查找位置,不知道另一個進程已經截斷了該文件。