分離されたコマンドに対して空のSTDINをシミュレートします。

分離されたコマンドに対して空のSTDINをシミュレートします。

コマンドを切り離すには、最後に「command &」または「nohup command &」を使用したいのですが、切り離した直後に停止します。

コマンドはあまり具体的ではなく、入力時にeofを受け取ると中断されるため、/dev/nullを入力として使用すると終了し、通常は有効な解決策になります。

$ command < /dev/null > /dev/null 2>&1 &

動作しません...

unix / linuxに/ dev / nullを置き換え、空の入力のように動作しますがeofを送信できない他のデバイスはありますか?

(しかし、コマンドは非常に便利なマルチキャストツールであるemcastです。直接パッチを試したり、この目的のためにパッチされたバージョンを見つけることができますが...問題は外部で解決できるようです。)

私の質問をより明確にするために、この編集内容を追加しています。私はこの2行のCプログラムを作成し、完璧に動作します。プログラム名は「donothing」です。

#include <unistd.h>
int main() {  while (1)  { sleep(10); } return 0; }

それが私が探しているものです。標準出力を開いたままにする以外に何もしないデバイス/プログラムです。 ("command &... disown" と "nohup command &") 両方が動作します。

$ donothing | mycommand >/dev/null & 
$ disown %1

うまく動作するので、問題はUNIXデバイス/プログラムが「何もしない」のように動作することです。

答え1

コマンドを検出するには、eof標準入力から読み取る必要があります。おそらく入力を待っているようです。したがって、必要なのは空の入力(/dev/nullまさにこの目的のため)ではなく、決して現れない入力のようです。

パイプを使用してシミュレートでき、反対側には誰も次の内容を作成しません。

sleep 999999999 | the-command

または、追加のコマンドを実行したくない場合は、名前付きsleepパイプを使用して実行できます。

fifo=$(mktemp -u) &&
  mkfifo "$fifo" &&
  (rm "$fifo" && the-command <&3 3<&- &) 3<> "$fifo"

/dev/null中間ファイルディスクリプタは、コマンドの起動時にシェルが暗黙的にstdinに接続されることを説明するためにここで使用されます&(ここで行ったように明示的なstdinリダイレクトを追加しない限り<&3)。

Linuxでは(おそらくLinuxでのみ)、次のことができます。

the-command < /dev/fd/1 3>&1 > /dev/null | :

/dev/fd/1ここで、fd 1は、Linuxで指定されたパイプのように動作するパイプに接続されています。つまり、読み取りモードで開くと、パイプの読み取り端が得られます。

したがって、上記のfd 0はパイプの読み取り端に接続され、もう一方の端はfd 3に接続されますthe-commandthe-commandfd 3には何も記録されないため、fd read0に対するすべての試行はブロックされます(または非ブロック読み取りは返されます)。まだ読む内容がありません。、または選択/ポーリングが返されます。読めないthe-command決して来ない入力を待つ以外の操作を行う場合は、これを行うことができます。

答え2

コマンドを使用する必要がありますdisown。これにより、これらのコマンドが実行されている現在のシェルでSTDIN / STDOUTが解放されます。

% disown -a

-または-

% sleep 100 &
[1] 7987
% disown %1

よりバッシュのマニュアルページもっと学ぶ。

disown [-ar] [-h] [jobspec...] オプションが存在しない場合、各ジョブ仕様はアクティブジョブリストから削除されます。 -hオプションを指定すると、各ジョブ仕様は表から削除されませんが、シェルがSIGHUPを受信したときにSIGHUPがジョブに送信されないように表示されます。ジョブ指定がなく、-aおよび-rオプションが指定されていない場合、現在のジョブが使用されます。 jobspecが指定されていない場合、-aオプションはすべてのジョブを削除または表示します。 jobspecパラメーターなしで、-rオプションはジョブを実行中のジョブに制限します。ジョブ指定が有効なジョブを指定しない限り、戻り値は 0 です。

答え3

自動化されたテストシステム(Jenkins)で予想されるスクリプトを実行するには、このようなものが必要です。 ExpectがstdinでEOFを検出すると、自動的にstdoutを閉じます。これにより、stdoutへのすべての書き込みが失敗し、テストが終了します。私は単に標準入力を/ dev / zeroに設定することでこの問題を解決しました。

mycommand </dev/zero

関連情報