[英]flock permission denied bash
我編寫了一個小測試腳本來防止與 flock 同時運行我的腳本:
#!/bin/bash
scriptname=$(basename $0)
lock="/var/run/${scriptname}"
umask 0002
exec 200>$lock
flock -n 200 || exit 1
## The code:
sleep 60
echo "Hello world"
當我與我的用戶一起運行該腳本並嘗試與另一個用戶一起運行該腳本時,我收到以下帶有鎖定文件的錯誤消息。
/var/run/test.lock: Permission denied
任何的想法?
親切的問候, 安德烈亞斯
在評論中,你提到了這一點
其他用戶屬於同一組。 文件權限是
-rw-r--r--
換句話說,只有第一個用戶對鎖定文件具有寫入權限。
但是,您的腳本會:
exec 200>$lock
它試圖打開鎖文件進行寫入 。 因此“權限被拒絕”錯誤。
打開文件進行寫入的優點是,如果文件不存在,它不會失敗,但這也意味着如果您的腳本同時運行,您無法輕易預測該文件的所有者將是誰比一個用戶。 [1]
在大多數Linux發行版中, umask
將設置為0022
,這會使新創建的文件具有權限rw-r--r--
,這意味着只有創建該文件的用戶才具有寫權限。 這是一個理智的安全策略,但它使用兩個或多個用戶之間共享的鎖文件變得復雜。 如果用戶位於同一組中,則可以調整umask,以便使用組寫權限創建新文件,並記住之后將其設置回來。 例如(未經測試):
OLD_UMASK=$(umask)
umask 002
exec 200>"$lock"
umask $OLD_UMASK
或者,您可以僅使用讀取權限[2]來應用鎖定,注意確保首先創建文件:
touch "$lock" 2>/dev/null # Don't care if it fails.
exec 200<"$lock" # Note: < instead of >
筆記:
[1]:與另一個問題exec 200>file
是它會截斷該文件,如果它確實存在,所以它僅適用於空文件。 通常,除非您確定該文件不包含任何有用信息,否則應使用>>
。
[2]: flock
不關心文件打開的模式。有關更多信息,請參閱man 1 flock
。
通過sudo /path/script.sh
而不是僅使用/path/script.sh
運行整個腳本
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.