nohup コマンドに問題があります。
仕事をしていると、大量のデータがあります。出力 nohup.out が大きくなりすぎて、プロセスが遅くなります。nohup.out を取得せずにこのコマンドを実行するにはどうすればよいですか?
コマンドは、出力が端末に送られる場合に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
たシグナルを受信します。 'ed プロセスは、すべてのシグナルを無視します。発送方法は問いません。)HUP
kill
nohup
HUP
説明:
Unixy システムでは、すべての入力ソースまたは出力ターゲットに、「ファイル記述子」または略して「fd」と呼ばれる番号が関連付けられています。実行中のすべてのプログラム (「プロセス」) には、これらの独自のセットがあり、新しいプロセスが開始されると、そのうちの 3 つが既に開いています。 fd 0 である「標準入力」は、プロセスが読み取るために開いています。 「標準出力」(fd 1)と「標準エラー」(fd 2)は、書き込み用に開いています。端末ウィンドウでコマンドを実行するだけの場合、デフォルトでは、入力したものはすべて標準入力に送られ、標準出力と標準エラーの両方がそのウィンドウに送信されます。
ただし、コマンドを起動する前に、これらのファイル記述子の一部またはすべてが指す場所を変更するようにシェルに要求できます。それが、リダイレクト ( <
、<<
、) およびパイプ ( ) 演算子が行うことです。>
>>
|
パイプはこれらの中で最も単純です...command1 | command2
の標準出力がcommand1
の標準入力に直接供給されるようにしますcommand2
。これは、UNIX ツールの特定の設計パターンにつながった非常に便利な配置です (また、出力がパイプライン内の次のプログラムに送られる場合でも、プログラムがユーザーにメッセージを送信できるようにする標準エラーの存在を説明しています)。 . ただし、標準出力を標準入力にパイプすることしかできません。いくつかのジャグリングなしでは、他のファイル記述子をパイプに送信することはできません。
リダイレクト演算子は、リダイレクトするファイル記述子を指定できるという点で使いやすいです。0<infile
という名前のファイルから標準入力を読み込み、 という名前のファイルの末尾に標準エラーを追加しinfile
ます。数値を指定しない場合、入力リダイレクトはデフォルトで fd 0 (と同じ) になり、出力リダイレクトはデフォルトで fd 1 (と同じ) になります。2>>logfile
logfile
<
0<
>
1>
また、ファイル記述子を組み合わせることができます。これ2>&1
は、「標準出力が出力される場所に標準エラーを送信する」ことを意味します。これは、標準出力と標準エラーの両方が混在し、それらを分離する方法がない単一の出力ストリームを取得することを意味しますが、標準エラーをパイプに含めることができることも意味します。
したがって、このシーケンス>/dev/null 2>&1
は、「標準出力を送信する/dev/null
」(これは、書き込んだものをすべて破棄する特別なデバイスです) 「次に、標準出力が送信される場所に標準エラーを送信する」ことを意味します (これは、 であることを確認しました/dev/null
)。基本的に、「このコマンドがいずれかのファイル記述子に書き込むものは何でも破棄します」。
nohup
標準エラーも出力も端末に接続されていないことが検出された場合、わざわざ を作成することはありませんnohup.out
が、ユーザーが希望する場所に出力が既にリダイレクトされていると想定します。
この/dev/null
デバイスは入力にも使用できます。でコマンドを実行すると</dev/null
、そのコマンドが標準入力から読み取ろうとすると、すぐにファイルの終わりに遭遇します。ここでは、マージ構文は同じ効果を持たないことに注意してください。ファイル記述子を、同じ方向 (入力または出力) で開かれている別の記述子にポイントする場合にのみ機能します。シェルはあなたにそれをさせますが>/dev/null <&1
、それは出力ストリームで開いている入力ファイル記述子を持つプロセスを作成することになります.
nohup some_command > /dev/null 2>&1&
あなたがする必要があるのはそれだけです!
3 つの I/O ストリームすべてをリダイレクトしてみましたか:
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
detach プログラムを使用することもできます。のように使用しnohup
ますが、指示しない限り出力ログは生成されません。マニュアルページは次のとおりです。
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.
注: 私はプログラムの作成者とは何の関係もありません。私はこのプログラムに満足しているユーザーにすぎません。