Bash

什麼是 Bash 中使用時間場景的簡單或簡單的檢查時間?

  • March 27, 2021

通常當用 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)上仍然不可靠,因為它們不提供用於目錄創建的原子操作。

毫無疑問還有很多其他的例子。

引用自:https://unix.stackexchange.com/questions/642350