[JM:01651] Re: [POST:DP] util-linux flock.1

アーカイブの一覧に戻る
長南洋一 cyoic****@maple*****
2019年 12月 5日 (木) 15:48:52 JST


長南です。

私はロックというものがよく分かっていません。ですから、私の解釈は見当違い
かもしれません。また、言葉の (用語の) 使い方がおかしいかもしれません。

○ The first and second of the above forms wrap the lock around the execu‐
  tion  of  a  command,  in a manner similar to su(1) or newgrp(1).  They
  lock a specified "file" or "directory", which is created  (assuming
  appropriate  permissions)  if it does not already exist.  By default,
  if the lock cannot be immediately acquired, flock  waits  until  the
  lock  is available.

  上記の 1 番目と 2 番目の形式は、 su(1) または newgrp(1)  と同じような方
  式で、  command 実行時のロックの取得をラップする。 これらのコマンドは指
  定された file または directory を、 もし存在しない場合は  (適切な権限が
  あれば)  作成を行ってから、ロックする。 デフォルトでは、 flock はロック
  を即時に取得するのではなく、ロックが可能になるまで待つ。

    wrap をどう訳すかが難しい。これは工夫した訳ですね。でも、「command 実行時の
    ロックの取得をラップする」で意味が通じるでしょうか? ラップやラッパーという
    言葉を普通に使う人なら、わかるかもしれませんが、その場合でも「command
    実行時の」という続け方は、かなり無理な気がします。「command の実行にロックの
    取得をラップする」の方がまだよいと思いますが、それでも、やっぱりわかりにくい。
    「ロックを取得して、command の実行をラップする」ぐらいでしょうか。やっぱり、
    わかっている人にしかわからない表現かもしれません。それから、"They" は、
    コマンドというより、"The first and second of the above forms" を
    受けているのだと思います。確かに、書式はコマンドではありますが。

    「ラップ」を使わない訳としては、こんなのもあるかもしれません。
    なお、「書式」セクションにあるコマンドの基本形なのですから、「形式」より
    「書式」の方がよいのではないかと思います。

    実は、ロックの対象が存在しないとき、ファイルは作成してくれますが、ディレクトリは
    作成してくれません。と言うより作成できないようです。以下は、そのへんを意識して
    います。

      上記の 1 番目と 2 晩目の書式では、file や directory をロックファイルに
      設定してから、その状況下で (or 環境下で) command を実行する。su(1) や
      newgrp(1) と類似した動作である。ロックを設定するとき、対象となるファイルが
      まだ存在していなければ、(適切なパーミッションを付けて) 作成する。デフォルト
      では、ロックが即座に取得できない場合は、取得できるようになるまで待機する。

    "wrap" を表に出すなら、こんなのも考えられます。

      上記の 1 番目と 2 晩目の書式では、ロックを取得してから、その状況下で
      (or 環境下で) command を実行する。command の実行を包み込むわけで、
      su(1) や newgrp(1) と類似した動作である。ロックを取得するとき、
      指定された file や directory がまだ存在していなければ、(適切な
      パーミッションを付けて) 作成する (訳注: 作成されるのは、ファイルだけ
      である)。デフォルトでは、ロックが即座に取得できないと、取得できるように
      なるまで待機する。

    "(assuming apropriate permission)" は、上の試訳でも示しましたが、
    "assuming that ..." ではありませんから、「想定する、仮定する」ではなく、
    「(形態を)取る、(様相・外観を)呈する、(性質を)おびる」(リーダーズ英和辞典)
    の意味でしょう。

    佐藤さんの訳では、"By default" 以下の "if" の訳が抜けています。 
    なお、この "if ..." と同じ表現が "--nonblock" にもあります。

○ The  third  form  uses an open file by its file descriptor "number".
   See the examples below for how that can be used.

  3 番目の形式では、ファイルディスクリプター number の オープンされたファ
  イルを使う。 どのように使うかは、下記の例を参照すること。

    内容的には間違えていません。ただ、前者二つの書式が、ファイル名やディレクトリ名を
    使うのに対して、この書式では (すでに)オープンされているファイルをそのファイル
    ディスクリプターで使うというのですから、そこを強調すべきだと思います。

      3 番目の書式では、(すでに) オープンされているファイルを、そのファイル
      ディスクリプター number で使用する。... 下記の「用例」を参照すること。

○ -E, --conflict-exit-code number
  The exit code used when the -n option is in use,  and  the  con‐
  flicting  lock exists, or the -w option is in use, and the time‐
  out is reached.  The default value is 1.

  -n  オプションが使われて、ロック競合が起こった場合、  または、-w
  オプションが使われて、タイムアウトに達した場合、  指定した返り値
  を使う。 デフォルトの値は 1 である。

    細かいことですが、「または」は「や」の方が、「場合」は「場合に」の方が、
    文章がが滑らかになると思います。たとえば、

      -n オプションの使用時にロックの競合が起きた場合や、-w オプションの使用時に
      タイムアウトに達した場合に使用する終了コード。デフォルトの値は 1 である。

    あるいは、ほとんど同じですが、

      -n オプションを使用して、ロックの競合が起きた場合や、-w オプションを使用して、
      タイムアウトに達した場合に使用する終了コード。デフォルトの値は 1 である。

○ -F, --no-fork
  ... This option is incompatible with --close as there  would  other‐
  wise be nothing left to hold the lock.

  ... このオプションは、ロックを保持するものが何も残らない --close  と
  は互換性がない。

    "incompatible" は、ここでは「互換性がない」ではなく、「両立しない、
    両方同時には使えない」です。

    "as" 以下の仮定法が難しい。"otherwise (さもなければ)" をどう取れば
    よいのか。たぶん、「"--no-fork" と "--close" が両立しないということが
    ないならば」、つまり「両立するならば、両方同時に使えるならば」なんでしょう。
    さらに「両方同時に使えるからと、--no-fork に加えて --close まで指定したら」
    まで考えてよいのかもしれません。

    "nothing left to hold the lock" の "nothing" は、"hold" の事実上の
    主語なのか目的語なのか (言い換えれば、"to hold" の意味は、形の通り能動なのか、
    それとも意味的には受動なのか)、これも難しい。"--close" の説明には、「ファイル
    ディスクリプターをクローズする」と書いてあります。"--close" を使うと、ロックの
    対象がなくなってしまうわけです。とすると、ここは、「ロックを保持するべき何物も
    残らない」と、"something to do"や "something to eat" のように、
    "nothing" を "to hold the lock (on)" の意味上の目的語と考えるべき
    なのでしょう。そうすると、たとえば、こんな風になります。

      command を実行する前にフォークしない。 実行時に、flock のプロセス
      は command に置き換えられて、 command がロックの保持を継続する。
      このオプションは --close とは両立しない (or 同時には使えない)。
      なぜなら、--close を使うと、ロックを掛けておく (or ロックを維持する、
      ロックしている) 対象がなくなってしまうからである

    私は、"hold the lock" というのは、「ロックを掛けておく」という日常的な
    表現ではないかと疑っています。もっとも、「ロックを保持する」と固く訳した方が
    よさそうなところもありますけれど。

○ -o, --close
   Close  the file descriptor on which the lock is held before exe‐
   cuting command.  This  is  useful  if  command  spawns  a  child
   process which should not be holding the lock.

   command を実行する前に、ロックを保持するファイルディスクリプター
   を クローズする。 これは、ロックを保持させたくない子プロセスを、
   command が生成する場合に役立つ。

     これだと、ファイルディスクリプターがロックを保持するようにも読めて
     しまいます。ここは「保持」ではなく「掛かる」を使った方が、紛らわしく
     なさそうです。"should" を「させたくない」と訳すのは、応用の広い
     うまい訳だと思います。それから、次の "-u" にも出てきますが、厳密には、
     「保持させておきたくない」です。大して変わりませんけれど。

       commnad を実行する前に、ロックの掛かっている (ロックしている、
       ロックを掛けている) ファイルディスクリプターをクローズする。...

○ -u, --unlock
  Drop  a  lock.   This  is  usually not required, since a lock is
  automatically dropped when the file is closed.  However, it  may
  be  required  in special cases, for example if the enclosed com‐
  mand group may have forked a background process which should not
  be holding the lock.

  ロックを解放する。  ロックはファイルがクローズされるときに自動的
  に解放されるので、 通常は必要ない。 しかし、例えばコマンドグルー
  プがロックを保持させたくない  バックグランドプロセスをフォークさ
  せるといった、特別なケースで 必要となることがある。

    「開放」は「解除」もあります。変なところに空白が入っています。

    それから、これは、ただの疑問なのですが、"the enclosed command group"
    というのは、何のことなんでしょう。

○ --verbose
  Report how long it took to acquire the lock,  or  why  the  lock
  could not be obtained.

  ロックを取得するのにかかった時間、またはロックが取得できなかった
  理由をレポートする。

    「レポートする」は、ちょっとものものしい。「報告する、通知する、表示する」
    などでよいのでは。

○ EXAMPLES
  他のメールでも言いましたが、"EXAMPLES" を「例」と訳すのは、あまり賛成できません。
  一文字のセクション名は、座りが悪いし、見落としやすいし、検索にも不便だからです。
  JM のセクション名の見本は「例」ですが、「用例」とか「実例」にした方がよいと
  前々から思ってます。もっとも、多分に好みの問題ですから、自分の考えを押し付ける
  気はありません。

○ shell1> flock /tmp -c cat
  shell2> flock -w .007 /tmp -c echo; /bin/echo $?
         Set exclusive lock to directory /tmp and the second command will
         fail.

  ディレクトリ /tmp の排他ロックを設定し、2 番目のコマンドは失敗する。

    「設定する」もあると思いますが、"set a lock" は辞書にも「錠をおろす」
    と出ている普通の表現ですから、「ロックを掛ける」が使えると思います。

      ディレクトリ /tmp に排他ロックを掛ける。従って、2 番目のコマンドは
      失敗する (ことになる)。

○ shell1> flock -s /tmp -c cat
  shell2> flock -s -w .007 /tmp -c echo; /bin/echo $?
         Set shared lock to directory /tmp and the  second  command  will
         not  fail.   Notice  that  attempting to get exclusive lock with
         second command would fail.

  ディレクトリ /tmp の共有ロックを設定し、2 番目のコマンドは失敗し
  ない。  共有ロックを取得しようとすると、2 番目のコマンドは失敗す
  る点に注意すること。

    前の例と同じです。なお、上の訳文では、"exclusive lock" が「共有ロック」
    になっています。

      ディレクトリ /tmp に共有ロックを掛ける。従って、2 番目のコマンドは
      失敗しない。2 番目のコマンドで排他ロックを取得しようとすると、失敗するのに
      気をつけること。

○  (
     flock -n 9 || exit 1
     # ... commands executed under lock ...
   ) 9>/var/lock/mylockfile
          The  form  is convenient inside shell scripts.  The mode used to
          open the file doesn't matter to flock; using > or >> allows  the
          lockfile  to  be  created if it does not already exist, however,
          write permission is required.  Using < requires  that  the  file
          already exists but only read permission is required.

          この形式はシェルスクリプト内で使うのに便利である。    ファイルを
          オープンするモードは、 flock には関係しない。 > または >> を使う
          と、ロックファイルが存在しない場合に、  ロックファイルを作成する
          ことができる。  ただし、書き込み許可が必要である。  <   を使う場
          合、ファイルは既に存在している必要があるが、  読み込み許可だけが
          必要である。

    "The form" は次の項目の "boilerplate" と同じことなのではありませんか。
    「形式」というより「書式、書き方、表現、表現形式、決まり文句」、もっとよい訳が
    あるかもしれません。最後の部分は、「必要」が三つ続くのがちょっと。
    「< を使う場合は、ファイルがすでに存在している必要があるが、読み込み許可
    さえあればよい」。

○ [  "${FLOCKER}"  != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0"
  "$@" || :
        This is useful boilerplate code for shell scripts.   Put  it  at
        the top of the shell script you want to lock and it'll automati‐
        cally lock itself on the first run.  If the env var $FLOCKER  is
        not  set  to  the  shell  script that is being run, then execute
        flock and grab an exclusive non-blocking lock (using the  script
        itself as the lock file) before re-execing itself with the right
        arguments.  It also sets the FLOCKER env var to the right  value
        so it doesn't run again.

        これはシェルスクリプトの有用な定型コードである。  これをロックし
        たいシェルスクリプトの先頭に置くと、  最初の実行時に自動的にロッ
        クが行われる。  実行されるシェルスクリプトに環境変数 $FLOCKER が
        設定されていない場合、 右側の引数で再実行する前に、 flock を実行
        して排他的なブロックされないロックを取得する   (スクリプト自体を
        ロックファイルとして使う)。 これは、環境変数 FLOCKER  を右側の値
        として設定するので、再度実行されない。

    "automatically lock itself" の "itself" の訳が抜けています。

    "If the env var $FLOCKER ..." の訳が多義的になっています。
    「実行中のスクリプト内で環境変数 FLOCKER が設定されていないと」ではなく、
    「環境変数 FLOCKER の値が、実行中のスクリプトになっていないと」の方だと
    はっきりさせないと。

    "non-blocking lock" は、"-n" によれば、「ロックが即時に取得できない場合、
    待たずに失敗する」ですから、「ブロックされない」では、意味が逆になります。
    「ブロッキングを起こさない」、言い換えれば「待機なしの」でしょう。

    "the right arguments" や "the right value" の "right" は、「正しい、
    適切な」でしょう。

      これは、シェルスクリプトで使うと便利な定形コードである。これをロックしたい
      シェルスクリプトの先頭に書いておくと、シェルスクリプトは、最初の実行時に
      自分自身を自動的にロックすることになる。すなわち、環境変数 FLOCKER の値が、
      目下実行中のシェルスクリプトになっていなければ、flock を実行して、排他的な
      待機なしのロックを取得し (スクリプト自身をロックファイルとして使用する)、
      その上で、適切な引き数を付けて自分自身を再実行する。スクリプトは、環境変数
      FLOCKER も正しい値に設定するので、スクリプトの実行がさらに繰り返される
      ことはない。

○ EXIT STATUS
  The  command  uses sysexits.h return values for everything, except when
  using either of the options -n or -w which report a failure to  acquire
  the lock with a return value given by the -E option, or 1 by default.

  このコマンドは sysexits.h の返り値をすべてにおいて使用する。 ただし、オ
  プション -n または -w  が使われた場合は、ロックの取得の失敗を  -E  オプ
  ションで指定された返り値 (デフォルトは 1) を使ってレポートする。

    "--verbose" でも言いましたが、「報告、通知」で十分でしょう。「レポート」を
    使う理由があれば別ですが。

○ When  using  the  command variant, and executing the child worked, then
  the exit status is that of the child command.

  command 引数が使われて、かつ子のコマンドが実行された場合、 返り値は子の
  コマンドの返り値となる。

    この "the command variant" は、たぶん command を引き数として使う
    書式の「別形、異型」、つまり第一と第二の書式のことだと思います。
    "executing the child" は動名詞でしょう。ですから、"executing the
    child worked" は、「子プロセスの実行 (起動) がうまく行った場合」。
    まとめると、

      command を引き数とする書式を使って、子となるコマンドの起動に成功した場合、
      flock の終了ステータスは、その子コマンドの終了ステータスである
      (or 子のコマンドの終了ステータスが、flock のそれになる)。

    私は、原則として、原文が "exit status" なら「終了ステータス」、
    "return value" なら「返り値」と訳すべきだという考えですから、上のように
    「終了ステータス」としましたが、そのへんは、当然翻訳者の裁量の範囲です。
    とくに、このマニュアルでは、"exit status", "return value", "exit code"
    を混ぜって使っています。訳語を一つにするか、混ぜて使うか、翻訳者が判断しなければ
    ならないところです。

-- 
長南洋一



linuxjm-discuss メーリングリストの案内
アーカイブの一覧に戻る