flock的许可被拒绝了
我写了一个小测试脚本,以防止与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 任何的想法? 亲切的问候, 解决方法
在评论中,你提到了这一点
换句话说,只有第一个用户对锁定文件具有写入权限. 但是,您的脚本会: 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>文件的另一个问题是,如果文件存在,它将截断文件,因此它仅适用于空文件.通常,您应该使用>>除非您确定该文件不包含任何有用信息. [2]:flock不关心文件打开的模式.有关更多信息,请参阅man 1 flock. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |