バックグラウンドでリモートでsshコマンドを実行するためにBashセクションをコピーしました。
ssh user@remote <<CMD
some process <&- >log 2>error &
CMD
<&-
効果は何ですか?
私の推測では何か関連があるようです。< /dev/null
次の理解は、次のことを防ぐために3つの主要なファイル記述子(stdin
、、、stdout
)を閉じる必要があることです。stderr
- バックグラウンドで実行されているジョブとスクリプトの終了中に競合が発生しますか?
- 端末が閉じると、端末からstdinを受け取るすべてのプロセスが閉じますか?
答え1
<&-
いいえかなり.fd < /dev/null
0<&-
を閉じます。< /dev/null
デバイスがリダイレクトしている間は/dev/null
データを提供せず、読み取り時に常にEOFを提供します。主な違いは、read(2)
閉じたFD(この<&-
場合)の呼び出しはEBADFエラーを引き起こし、空のリダイレクトFDの呼び出しは読み取ったバイト(ファイルの終わり条件)を返さないことです。プログラムが標準入力からデータを読み取らない場合、違いは重要ではありません。
バックグラウンドで何かを実行するには、FDをオフにすることをお勧めします。なぜなら、バックグラウンドプロセスがTTYから何でも読み取ろうとすると中断されるからです。ただし、この例では必要なすべてを処理するわけではありませんが、理想的にはバックグラウンドプロセスを完全に分離するためにどこかにnohup
OR呼び出しがあるはずです。setsid
答え2
バラよりman bash
:
[n]<&word
入力ファイル記述子のコピーに使用されます。
word
1 つ以上の数字に展開すると、表示されるファイル記述子はn
そのファイル記述子のコピーになります。数値が入力word
用に開かれたファイル記述子を指定しないと、リダイレクトエラーが発生します。 wordがと評価されると、-
ファイル記述子がn
閉じます。指定しないと、n
標準入力(ファイル記述子0)が使用されます。
答え3
<&-
標準入力を閉じます。
これPOSIXで定義した一般形式、例:
[n]<&word
ファイル記述子が生成された目的は、n
ファイル記述子のコピーとして表示されますword
。省略するとn
標準入力とみなされ、そうであればword
ファイル-
記述子がn
閉じられます。
</dev/null
これは、</dev/null
標準入力がまだ開いていて他の場所にリダイレクトされるという点で異なります。
SSHソケットに接続されているプロセスのすべてのファイル記述子を閉じる必要があります。それ以外の場合、SSH セッションを閉じることはできません。
以下を使用して、SSHセッションに接続しなくてもリモートシステムでコマンドを実行できます。画面またはマルチプレクサ:
ssh user@remote 'screen -S test -d -m command'