web-dev-qa-db-ja.com

フューザー出力があいまいに見える

fuserを使用しています。出力は次のようになります。

$ fuser / 
/:                    1354rc  1362r  1370rc  1371rc  1395rc  1399rc  1403rc  1410rc  1414rc  1428r  1451rc  1458rc  1470rc  1472rc  1477rc  1480rc  1487rc  1492rc  1500rc  1504rc  1508r  1513r  1516rc  1551r  1563rc  1567rc  1569rc  1586rc  1592rc  1629r  1630r  1633r  1645r  1660r  1695rc  1712rc  1728rc  1885r  2262rc  2273r  2585r  2602r  3342r  3799r

私はこれを理解していますが、それをwcまたはnlにパイプすると、出力が次のようになります。誰か教えてもらえますか?

$ fuser / | nl
/:                  rcrrcrcrcrcrcrcrcrrcrcrcrcrcrcrcrcrcrcrrrcrrcrcrcrcrcrrrrrrcrcrcrrcrrrrrr
     1    1354  1362  1370  1371  1395  1399  1403  1410  1414  1428  1451  1458  1470  1472  1477  1480  1487  1492  1500  1504  1508  1513  1516  1551  1563  1567  1569  1586  1592  1629  1630  1633  1645  1660  1695  1712  1728  1885  2262  2273  2585  2602  3342  3799  4618
1
amir jj

フューザーの一部はstdout(標準出力)に送信され、一部は標準エラーに送信されます。

出力はどのように分割されますか?

配管機構は標準出力のみをキャッチします。

プレーンフューザー

mybox $ fuser /
/:                     350r   356r   357r   364r 10484rc 10485r

ファイルのタイプ(cまたはr)がstderrにあるのに対し、pidがaにあるのを参照してください。

mybox $ fuser / > a
/:                  rrrrrcr

ファイル「a」は改行で終わらない。

mybox $ cat a
   350   356   357   364 10484 10485mybox $

現在、両方をリダイレクトしています。

mybox $ fuser / > aa 2> bb

mybox $ cat aa
   350   356   357   364 10484 10485mybox $
mybox $ cat bb
/:                  rrrrrcr
  • 2>リダイレクトstderr

1つのコマンドで両方をパイプする

mybox $ fuser / > cc 2>&1
mybox $ fuser / 2>&1 | wc
    1       8      71
mybox $ fuser / 2>&1 | nl
    1  /:                     350r   356r   357r   364r 10484rc 10485r 11761r
  • 2>&1 "merge" stdoutおよびstderr

なぜ出力が分割されるのですか?

フューザーの主な用途の1つは、プロセスの「保持」マウントポイントを強制終了することです。

上記の私のコマンドから、ファイルの内容を使用してすべてのプロセスを強制終了できます。

mybox $ fuser /foo/bar > a
/foo/bar:                  rrrrrcr

mybox $ cat a
   350   356   357   364 10484 10485mybox $
mybox $ kill $(<a)
  • $()構文の意味:ファイル 'a'の内容
2
Archemar

フューザーは、出力の一部をstdoutに送信し、出力の一部をstderrに送信するように作成されました。これは2つの理由で行われました。

  1. これは、一致するすべてのpidを別のプロセスにパイプできることを意味します
  2. POSIX標準はそう言っています

これは何かを記述してデバッグする最も簡単な方法ではありませんが、長続きする標準であるため、それを好きか嫌いか、それが出力を送信する方法です。つまり、パイプまたはリダイレクトすると、多くのpidまたはフラグが表示されますが、両方は取得されません。

そのような理由の詳細については、 #166417 を参照してください。

1
Craig Small