bash羊群:为啥是200?

Posted

技术标签:

【中文标题】bash羊群:为啥是200?【英文标题】:bash flock: Why 200?bash羊群:为什么是200? 【发布时间】:2012-11-13 03:53:12 【问题描述】:

关于那个线程: bash flock: exit if can't acquire lock

如果有人能向我解释一下“200”代表什么,我将不胜感激。

我读过关于flock的文章,如果指定一个文件描述符似乎是200,但是这个数字有什么好处呢?

【问题讨论】:

只是一个任意的文件描述符编号。 【参考方案1】:

数字 200 没有什么特别之处。它恰好是flock 命令手册页中使用的示例;而且它恰好是一个很大的数字,因此它不太可能与您在脚本期间打开的任何其他文件的文件描述符发生冲突。

在您的评论中,您询问:

( 
  flock -e 200
  echo "In critical section"
  sleep 5 
) 200>/tmp/blah.lockfile 
echo "After critical section"

括号() 创建一个子shell;一个新的进程,与父进程分开。 200>/tmp/blah.lockfile 导致该进程打开 /tmp/blah.lockfile 以在文件描述符 200 上写入。括号内的命令在该 shell 中执行。

flock -e 200 在文件描述符 200 指向的文件上获得排他锁。排他锁意味着任何其他试图获得该文件上的锁的人,无论是排他的还是共享的,都会阻塞(等待)直到这个锁已被放弃,或者如果他们遇到超时或被要求不阻止则失败。因此,在子shell 主体的剩余部分(echosleep 命令)中,锁将由该子shell 持有,其他人无法获得该锁。子shell完成后,文件将被关闭并放弃锁定。

【讨论】:

谢谢。我是 bash 脚本的新手,请您向我解释一下其余的代码:( flock -e 200 echo "In critical section" sleep 5 ) 200>/tmp/blah.lockfile echo "After critical section" @Rapher 技术上没有必要;您可以在执行代码之前获取锁,然后释放它。但是,它使管理锁很方便;您可以保证在子shell退出时锁定将被丢弃,因此您不能忘记丢弃锁定(或由于其他原因未能丢弃它),并且很容易看到锁定适用的范围只需匹配括号。 感谢您的回答。无论如何,有没有一种简单的方法可以确保没有冲突? “不太可能”可能并不总是足够的。 @didi_X8 使用真正的编程语言而不是 Bash。 Bash 用于快速而肮脏的脚本;如果您想保证行为,最好不要使用具有如此多奇怪和令人惊讶的行为的语言(例如执行环境变量的内容)。也就是说,在 Bash 中,除非您明确使用该文件描述符进行重定向,否则您不会打开新的文件描述符; exec 3>/some/file,或具有类似编号重定向的子shell。所以你可以手动跟踪数字,记住 0、1 和 2 是标准输入、标准输出和标准错误。 所以如果你在多个脚本中使用这种技术,你会使用不同的数字吗?还是不同的锁定文件名?

以上是关于bash羊群:为啥是200?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 += 在 bash 中存储命令的退出状态?

为啥我不能在 bash 脚本中使用作业控制?

为啥我不能在 bash 脚本中使用作业控制?

为啥 bash 在写入命名管道时关闭?

为啥 Python 不运行我的 bash 代码?

为啥需要将#!/bin/bash 放在脚本文件的开头?