Bash
什麼是 Bash 中使用時間場景的簡單或簡單的檢查時間?
通常當用 Bash 解釋軟體開發概念時,我比用 JavaScript 更理解它們。
關於檢查時間到使用時間(TOCTOU),它在維基百科目前的開頭段落中有所說明:
在軟體開發中,time-of-check to time-of-use(TOCTOU、TOCTTOU 或 TOC/TOU)是一類軟體錯誤,由涉及系統部分狀態檢查的競爭條件(例如安全憑證)以及該檢查結果的使用。
什麼是 Bash 中使用時間場景的簡單或簡單的檢查時間?
我在此站點上看到的最常見的這種類型的競爭條件與程序 ID (PID) 的處理和基於這些的信號傳輸有關。
有人可能正在使用
ps
+grep
來獲取某個命名程序的 PID,然後kill
發出信號。在獲取 PID 和發出信號之間,PID 可能已經消失。使用pkill
最小化此錯誤發生的視窗。在其他情況下,持有一個 PID 並期望它在較長時間內始終引用同一個程序(例如,在“PID 文件”中),可能會導致信號被發送到錯誤的程序。這是因為所有 Unix 系統都重用 PID。
另一個常見問題是文件鎖定,即使用文件系統為多程序同步和臨界區提供鎖定機制。例如,可以測試某個“鎖定文件”是否存在,如果不存在,則創建它,從而“獲取鎖定”。在檢查文件是否存在和創建鎖定文件之間,其他一些程序也有機會意識到鎖定文件不存在:
while [ -e "$lockfile" ]; do sleep 10 done touch "$lockfile" echo 'got lock' # or did I? # do work rm -f "$lockfile"
在這種情況下,解決方案是使用專用的文件鎖定工具,例如
flock
,或使用鎖定目錄,因為mkdir
它是原子的:while ! mkdir "$lockdir" 2>/dev/null; do sleep 10 done echo 'got lock' # do work rmdir "$lockdir"
這在網路文件系統(如 NFS)上仍然不可靠,因為它們不提供用於目錄創建的原子操作。
毫無疑問還有很多其他的例子。