コマンドを切り離すには、最後に「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-command
。the-command
fd 3には何も記録されないため、fd read
0に対するすべての試行はブロックされます(または非ブロック読み取りは返されます)。まだ読む内容がありません。、または選択/ポーリングが返されます。読めない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