我有我的crontab作業奇怪的問題。我的crontab任務執行以下操作:bash>重定向原子?
program > file
但有時候文件被充滿了,我無法解釋隨機數據。
我不知道它是否可能是以前的crontab作業需要更長的時間運行,它以某種方式將其結果file
與當前的crontab作業混合?
總的來說我的問題是:是>
運算原子?意思是如果兩個程序做> file
,那麼最後一個要完成的數據將在file
?
我有我的crontab作業奇怪的問題。我的crontab任務執行以下操作:bash>重定向原子?
program > file
但有時候文件被充滿了,我無法解釋隨機數據。
我不知道它是否可能是以前的crontab作業需要更長的時間運行,它以某種方式將其結果file
與當前的crontab作業混合?
總的來說我的問題是:是>
運算原子?意思是如果兩個程序做> file
,那麼最後一個要完成的數據將在file
?
不,它不是原子的。甚至沒有一點原子。
重定向做了兩兩件事:
它的名字打開文件,創造它,如果必要的。
它截斷文件。
之後,實用程序啓動,其stdin
分配給打開的文件。
如果兩個腳本同時或多或少地做了這些事情,它們最終都會寫入相同的文件,但由於它們將具有獨立的文件描述符,因此每個進程都會覆蓋另一個進程的輸出,從而產生較大的交織字節,一些來自一個進程,另一些來自另一個進程。
另一種常見的競爭條件與該實用程序在開始執行之前該文件被截斷(由shell)相關。因此,即使該實用程序只向該文件寫入一行,也可能是一個讀取文件的併發實用程序將發現它是空的。
它不是原子的。您可以輕鬆地驗證自己:
({ echo a ; sleep 3; echo b ; } > 1) &
({ echo c ; sleep 1 ; echo d ; } > 1)&
sleep 5 ; cat 1
慶典>
與一個open
與標誌(爲慶典30年4月3日至少)O_TRUNC | O_WRONLY | O_CREAT
(從make_cmd.c的707線)
所以每次必做截斷該文件並寫入它。如果以前的進程仍然有一個打開的文件句柄,它將繼續寫入,並且在文件的查找位置,不知道另一個進程已經截斷了該文件。
如果你想簡單地避免你的程序一次運行的兩個實例,你可以使用'GNU並行',但調用它爲'sem -id mySemaphore程序'來創建一個互斥信號類型的信號量。 –
@MarkSetchell你的意思是我應該通過並行運行我的cron作業嗎? – bodacydo
http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Working-as-mutex-and-counting-semaphore –