我编写了一个小测试脚本,以防止我的脚本与集群同时运行:
#!/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"
Run Code Online (Sandbox Code Playgroud)
当我与我的用户一起运行脚本并尝试与另一个用户一起运行脚本时,我收到以下带有锁定文件的错误消息。
/var/run/test.lock: Permission denied
Run Code Online (Sandbox Code Playgroud)
任何想法?
亲切的问候,安德烈亚斯
在评论中,您提到
其他用户在同一组中。文件权限是
-rw-r--r--
换句话说,只有第一个用户对锁定文件具有写权限。
但是,您的脚本会:
exec 200>$lock
Run Code Online (Sandbox Code Playgroud)
它尝试打开锁定文件进行写入。因此出现“权限被拒绝”错误。
打开文件进行写入的优点是,如果文件不存在,写入也不会失败,但这也意味着,如果您的脚本由多个脚本同时运行,您将无法轻松预测该文件的所有者是谁。比一个用户。[1]
在大多数Linux发行版中,umask会被设置为0022,这会导致新创建的文件具有权限rw-r--r--,这意味着只有创建该文件的用户才有写权限。这是明智的安全策略,但使用两个或多个用户之间共享的锁定文件会使情况变得复杂。如果用户位于同一组中,您可以调整 umask,以便使用组写入权限创建新文件,并记住随后将其设置回来。例如(未经测试):
OLD_UMASK=$(umask)
umask 002
exec 200>"$lock"
umask $OLD_UMASK
Run Code Online (Sandbox Code Playgroud)
或者,您可以仅使用读取权限 [2] 应用锁定,并注意确保首先创建文件:
touch "$lock" 2>/dev/null # Don't care if it fails.
exec 200<"$lock" # Note: < instead of >
Run Code Online (Sandbox Code Playgroud)
笔记:
[1]:另一个问题exec 200>file是,如果文件存在,它会截断该文件,因此它仅适用于空文件。一般来说,>>除非您确定该文件不包含有用的信息,否则您应该使用。
[2]:flock不关心文件以什么模式打开。请参阅 参考资料 获取man 1 flock更多信息。
| 归档时间: |
|
| 查看次数: |
5786 次 |
| 最近记录: |