[英]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.