我写了一个小测试脚本来防止我的脚本与 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
有什么想法吗?
亲切的问候, 安德烈亚斯
最佳答案
在评论中,你提到了这一点
other user is in the same group. file permissions are
-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
。
关于bash - 羊群权限被拒绝 bash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23469301/