回答:
このnohup
コマンドはnohup.out
、出力がターミナルに送信される場合にのみ書き込みます。コマンドの出力を別の場所(リダイレクトを含む)にリダイレクトした場合は、/dev/null
代わりにそこに移動します。
nohup command >/dev/null 2>&1 # doesn't create nohup.out
を使用している場合nohup
、それはおそらく&
、全体の最後に別のコマンドを配置して、コマンドをバックグラウンドで実行することを意味します。
nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
Linuxでは、ジョブを実行するとnohup
、その入力も自動的に閉じます。他のシステム、特にBSDとmacOSはそうではないので、バックグラウンドで実行しているときは、入力を手動で閉じることができます。入力を閉じてもの作成には影響しませんがnohup.out
、別の問題は回避されます。バックグラウンドプロセスが標準入力から何かを読み取ろうとすると、プロセスは一時停止し、フォアグラウンドに戻して何かを入力するのを待ちます。したがって、安全なバージョンは次のようになります。
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
ただし、これによってコマンドが端末に直接アクセスできなくなることはなく、シェルのプロセスグループから削除されることもありません。後者を実行する必要があり、bash、ksh、またはzshを実行disown
している場合は、次のコマンドとして引数なしで実行することで実行できます。これは、バックグラウンドプロセスがシェルの「ジョブ」に関連付けられておらず、シェルから転送されたシグナルがないことを意味します。(違いに注意してください:disown
edプロセスは親シェルによって自動的に転送されるシグナルを取得しません-なしnohup
でもHUP
、手動kill
コマンドなどの他の手段を介して送信されたシグナルを受信しnohup
ます。'edプロセスはすべてのHUP
シグナルを無視します。送信方法に関係なく)。
説明:
Unixyシステムでは、すべての入力ソースまたは出力ターゲットには、「ファイル記述子」または略して「fd」と呼ばれる番号が関連付けられています。実行中のすべてのプログラム(「プロセス」)には、これらの独自のセットがあり、新しいプロセスの起動時には、3つのプログラムがすでに開いています。「標準入力」は、fd 0であり、プロセスから読み取るために開いています。 「標準出力」(fd 1)と「標準エラー」(fd 2)は、書き込み可能です。ターミナルウィンドウでコマンドを実行するだけの場合、デフォルトでは、入力したものはすべて標準入力に送られ、標準出力と標準エラーの両方がそのウィンドウに送られます。
ただし、コマンドを起動する前に、これらのファイル記述子の一部またはすべてが指す場所を変更するようにシェルに要求できます。リダイレクト(何それ<
、<<
、>
、>>
)およびパイプ(|
)演算子が行います。
パイプはこれらの中で最も単純です... command1 | command2
の標準出力がcommand1
の標準入力に直接フィードされるように調整しますcommand2
。これは、UNIXツールの特定の設計パターンにつながる非常に便利な配置です(そして、出力がパイプラインの次のプログラムに送られる場合でも、プログラムがユーザーにメッセージを送信できるようにする標準エラーの存在を説明します)。 。ただし、パイプで出力できるのは標準出力のみです。ジャグリングせずに他のファイル記述子をパイプに送信することはできません。
リダイレクト演算子は、リダイレクトするファイル記述子を指定できるという点でより使いやすくなっています。だから、0<infile
指定されたファイルから標準入力を読み取りinfile
ながら、2>>logfile
指定されたファイルの末尾に標準誤差を付加logfile
。数値を指定しない場合、入力リダイレクトはデフォルトでfd 0(<
と同じ0<
)になり、出力リダイレクトはデフォルトでfd 1(>
と同じ1>
)になります。
また、ファイル記述子を一緒に組み合わせることができます。2>&1
つまり、「標準出力が行われるところはどこでも標準エラーを送信する」という意味です。これは、標準出力と標準エラーの両方を含む単一の出力ストリームを取得し、それらを分離する方法がなくなったことを意味しますが、標準エラーをパイプに含めることもできます。
したがって、シーケンスと>/dev/null 2>&1
は、「標準出力をに送信/dev/null
(これは、ユーザーが書き込んだものを破棄するだけの特別なデバイスです)」、そして標準出力をどこにでも標準エラーを送信することを意味します(これは確認済みです/dev/null
)。基本的に、「このコマンドがいずれかのファイル記述子に書き込むものはすべて破棄します」。
ときnohup
検出は、その標準誤差も出力もないが、端末に接続されていること、それが作成する気にしませんnohup.out
が、出力が既にユーザーはそれが行きたいところにリダイレクトされていることを前提としています。
/dev/null
デバイスは、あまりにも、入力のために働きます。コマンドを</dev/null
で実行すると、そのコマンドが標準入力から読み取ろうとすると、すぐにファイルの終わりに遭遇します。マージ構文はここでは同じ効果を持たないことに注意してください。これは、ファイル記述子を、同じ方向(入力または出力)で開いている別のファイル記述子を指すように機能するだけです。シェルではこれを実行できますが>/dev/null <&1
、出力ストリームで入力ファイル記述子を開いてプロセスを作成する必要があるため、ファイルの終わりに到達するだけでなく、読み取りを試行すると致命的な「無効なファイル記述子」エラーがトリガーされます。
nohup
「プロセスが後で標準入力から何かを読み取ろうとすると、プロセスは一時停止し、フォアグラウンドに戻して何かを入力するのを待ちます。」正しくないようです。代わりに、nohup
標準入力を閉じます(フォアグラウンドで実行されている場合でも、プログラムは入力を読み取ることができません。停止されませんが、エラーコードまたはEOFを受け取ります)。
nohup
ません。これnohup
は組み込みのシェルではなく、バイナリユーティリティです。
nohup
LinuxとBSDまたはOS Xでは実装が異なるということですか?
awk
異なる、sed
異なる、nohup
異なる...
nohup some_command > /dev/null 2>&1&
これで完了です。
&
使用する必要からあなたを維持する上でctrl-c
、あなたにその問題ならば、。
some_command
、エラーを含む出力のキャプチャに慣れていない場合にのみ役立ちます。
3つのI / Oストリームをすべてリダイレクトしてみましたか?
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
>
</ dev / nullではなく/ dev / nullにすべきではありませんか?
< /dev/null
標準入力をリダイレクトしますnohup
。Linuxはこれを必要としませんが、POSIXはnohup
、標準入力が端末に接続されている場合、バックグラウンドで実行できない動作を許可します。このようなシステムの例としては、BSDとOS Xのです
detachプログラムを使用することもできます。のように使用しnohup
ますが、指示しない限り、出力ログは生成されません。これがmanページです:
NAME
detach - run a command after detaching from the terminal
SYNOPSIS
detach [options] [--] command [args]
Forks a new process, detaches is from the terminal, and executes com‐
mand with the specified arguments.
OPTIONS
detach recognizes a couple of options, which are discussed below. The
special option -- is used to signal that the rest of the arguments are
the command and args to be passed to it.
-e file
Connect file to the standard error of the command.
-f Run in the foreground (do not fork).
-i file
Connect file to the standard input of the command.
-o file
Connect file to the standard output of the command.
-p file
Write the pid of the detached process to file.
EXAMPLE
detach xterm
Start an xterm that will not be closed when the current shell exits.
AUTHOR
detach was written by Robbert Haarman. See http://inglorion.net/ for
contact information.
注プログラムの作成者とは関係ありません。私はプログラムの満足しているユーザーです。
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null" &
sudoの出力をリダイレクトすると、sudoがパスワードを再要求するため、このバリアントを実行するには厄介なメカニズムが必要です。
mac / linuxの前にBASHシェルがある場合は、以下の手順を試して、リダイレクトを実際に理解してください。
zz.shという2行のスクリプトを作成します。
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
現在、単純にスクリプトを実行すると、STDOUTとSTDERRの両方が画面に送信されます。
./zz.sh
次に、標準のリダイレクトから始めます。
zz.sh > zfile.txt
上記では、「echo」(STDOUT)がzfile.txtに入ります。一方、画面には「エラー」(STDERR)が表示されます。
上記は同じです:
zz.sh 1> zfile.txt
これで、反対を試すことができ、「エラー」STDERRをファイルにリダイレクトできます。「echo」コマンドからのSTDOUTが画面に表示されます。
zz.sh 2> zfile.txt
上記の2つを組み合わせると、次のようになります。
zz.sh 1> zfile.txt 2>&1
説明:
最終的に、nohupコマンド内にすべてを詰め込み、バックグラウンドで実行することができます 。
nohup zz.sh 1> zfile.txt 2>&1&