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
なしでは、手動の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 some_command > /dev/null 2>&1&
あなたがする必要があるのはそれだけです!
3つのI/Oストリームすべてをリダイレクトしてみましたか。
Nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
デタッチプログラム を使用することをお勧めします。あなたはそれを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はパスワードを要求し直すので、この変種を実行するには厄介なメカニズムが必要です。
nohup&> 2>&1&の下で行うことができます。スクリプト内にhupコマンドがありません。/Runjob.sh> sparkConcuurent.out 2>&1
あなたの前のあなたの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&