`<&-`は何をしますか?


20

Bashのスニペットをコピーして、リモートで実行されるsshコマンドをバックグラウンド化しました。

ssh user@remote <<CMD
some process <&- >log 2>error &
CMD

何を<&-するの?
私の推測では、それは同じです< /dev/null

私の次の理解では、三つの主要なファイルディスクリプタが(ということでstdinstdoutstderr)を防止するためにクローズする必要があります。

  1. ジョブがバックグラウンドになり、スクリプトが終了します-どういうわけか競合しますか?
  2. ターミナルを閉じると、ターミナルからstdinを受け入れているすべてのプロセスが閉じられますか?

必須の相互参照:シェルの制御およびリダイレクト演算子とはを参照してください—この演算子については、「ファイル記述子を閉じるまたは複製するために使用できる」というだけであり、「シェルのマニュアルの関連セクションを参照する」必要があります。
G-Manは「Reinstate Monica」と言います

正しく思い出せばssh -nNT user@remote 'command'、非対話型のSSHセッションが作成されます。追加&の背景にそれ、前に付加nohupcommandの接続ダイあれば実行し、それを維持します。
マークKコーワン

1
@MarkKCowan man sshは、-Nがリモートコマンドの実行を完全に無効にすることを提案し、クイックテストはそれをサポートします。
トム・ハント

ああ、そうです、逆ポート転送に-nNTRを使用しました。-Nと-Rを無視してから:)
マークKコーワン

回答:


30

<&-とはまったく同じではありません< /dev/null<&-fd 0を閉じますが< /dev/null、デバイスからリダイレクトします/dev/null。これは、データを提供せず、読み取り時に常にEOFを提供します。違いは主にread(2)、閉じたFD(<&-ケース)からの呼び出しはEBADFでエラーになるのに対して、nullリダイレクトFDからの呼び出しは読み取ったバイトを返さない(ファイルの終わり条件)ことです。プログラムが標準入力から読み取らない場合、区別は重要ではありません。

バックグラウンドのプロセスはTTYから何かを読み取ろうとするとハングするため、何かをバックグラウンド化する場合は、FDを閉じることをお勧めします。ただし、この例は、必要なすべてを完全に処理するわけではありません。理想的には、バックグラウンドプロセスを完全に分離するために、どこかnohupまたはsetsid呼び出しがあります。


したがってnohup、ファイル記述子を閉じることに加えて使用する必要がありますか?
エリックフランシス

2
最も徹底的な方法(プログラムが自身をデーモン化する方法を模倣する)は、のようなものですsetsid some process <&- >path/to/log 2>path/to/error。より速い方法は次のようなものですnohup some process &
トム・ハント

2
@EricFrancis:nohupここでの使用は意味がありません。制御端末が閉じたときにnohupプロセスがHUP信号を受信しないようにします。ただし、この場合、端末はありませんでした。
クオンルム

@TomHunt:バックグラウンドプロセスはハングせず、sshセッションがハングしました。
クオンルム

2
fds 0、1、および2を閉じることはお勧めできません...次のfdがこれらの値の1つを使用することは望ましくありません。それらを/ dev / nullにリダイレクトする方が良い
マレージェンセン

7

参照man bash

  [n]<&word

入力ファイル記述子を複製するために使用されます。場合はword1桁以上に膨張し、で示されるファイルディスクリプタは、nそのファイルディスクリプタのコピーとされています。の数字がword 入力用に開いているファイル記述子を指定していない場合、 リダイレクトエラーが発生します。wordがに評価される場合-、ファイル記述子nは閉じられます。nが指定されていない場合、標準入力(ファイル記述子0)が使用されます。


正しい定義は、あなたが持っているときに何が起こるかは明記されていない[n]<&wordということであり、単語には1桁以上が含まれています。
気味悪い

どういう意味ですか?あるman bash間違いましたか?
エリックフランシス

@EricFrancisは標準では指定されていないbashため、適切な方法で実装することを選択します( "sane"の適切な定義のため)。他のシェルはそうする場合もしない場合もあります。
ムル

@muru質問にはタグが付いてbashposix-shellますが、タグは付いていません。
バーマー

@バーマーオーケー。そう...?
ムル

7

<&- 標準入力を閉じます。

POSIXによって定義された一般的な形式は、次のとおりです。

[n]<&word

ファイル記述子を作成する目的nは、で示されるファイル記述子のコピーですword。場合は、標準では、想定されるn省略され、かつ場合word-、ファイルディスクリプタがnクローズされます。

</dev/null場合</dev/null、標準入力はまだ開いていて、他の場所にリダイレクトされているため、とは異なります。

sshソケットに接続されたプロセスのすべてのファイル記述子を閉じる必要があります。そうしないと、sshセッションを閉じることができません。

screenまたはtmuxを使用して、sshセッションにアタッチせずにリモートマシンでコマンドを実行できます。

ssh user@remote 'screen -S test -d -m command'

なぜ反対票なのか?
クオンルム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.