web-dev-qa-db-ja.com

Nohup.outを取得せずにNohupコマンドを使用する方法

Nohupコマンドに問題があります。

仕事をするとき、私はたくさんのデータを持っています。出力Nohup.outが大きくなりすぎて、私のプロセスが遅くなります。 Nohup.outを取得せずにこのコマンドを実行する方法を教えてください。

251
Ofer

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を実行することで実行できます。これは、バックグラウンドプロセスがシェルの「ジョブ」に関連付けられなくなり、シェルから転送された信号がないことを意味します。 (区別に注意してください:disownedプロセスは、その親シェルによって自動的に転送されるシグナルを取得しませんが、Nohupなしでは、手動のHUPコマンドなどの他の手段を介して送信されるkillシグナルを受信すると終了します。Nohup 'edプロセスどのように送信されても​​、すべてのHUPシグナルを無視します。)

説明:

Unixyシステムでは、入力のソースまたは出力のターゲットにはすべて、「ファイル記述子」または略して「fd」と呼ばれる番号が関連付けられています。実行中のすべてのプログラム(「プロセス」)には、これらの独自のセットがあり、新しいプロセスが起動すると、そのうちの3つが既に開いています。「標準入力」はfd 0であり、 「標準出力」(fd 1)と「標準エラー」(fd 2)が書き込み用に開かれています。端末ウィンドウでコマンドを実行するだけの場合、デフォルトでは、入力したものはすべて標準入力に送られ、標準出力と標準エラーの両方がそのウィンドウに送信されます。

ただし、コマンドを起動する前に、これらのファイル記述子の一部またはすべてが指す場所を変更するようにシェルに依頼できます。それが、リダイレクト(<<<>>>)およびパイプ(|)演算子が行うことです。

パイプはこれらの中で最も単純です... command1 | command2command1の標準出力をcommand2の標準入力に直接供給するように調整します。これは、UNIXツールの特定の設計パターンにつながった非常に便利な配置です(そして、標準エラーの存在を説明します。これにより、出力がパイプラインの次のプログラムに送られても、プログラムがユーザーにメッセージを送信できます) 。ただし、標準出力にパイプできるのは標準入力のみです。いくつかのジャグリングなしでは、他のファイル記述子をパイプに送信することはできません。

リダイレクト演算子は、リダイレクトするファイル記述子を指定できるという点で使いやすいです。したがって、0<infileinfileという名前のファイルから標準入力を読み取り、2>>logfilelogfileという名前のファイルの末尾に標準エラーを追加します。番号を指定しない場合、入力リダイレクトのデフォルトは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を実行できますが、出力ストリームで開いている入力ファイル記述子を使用してプロセスを作成するため、ファイルの終わりを押すだけでなく、読み取りを試みると致命的な「無効な」ファイル記述子」エラー。

531
Mark Reed
Nohup some_command > /dev/null 2>&1&

あなたがする必要があるのはそれだけです!

61
11101101b

3つのI/Oストリームすべてをリダイレクトしてみましたか。

Nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
9
Aziz Shaikh

デタッチプログラム を使用することをお勧めします。あなたはそれを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.

注意私はプログラムの作者と提携していません。私はこのプログラムに満足しているだけです。

8
Dan D.

次のコマンドを使用すると、Nohup.outを取得せずにバックグラウンドで何かを実行できます。

Nohup command |tee &

このようにして、リモートサーバーでスクリプトを実行中にコンソール出力を取得できます。 enter image description here

5
Clownfish
Sudo bash -c "Nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null"  &

Sudoの出力をリダイレクトすると、Sudoはパスワードを要求し直すので、この変種を実行するには厄介なメカニズムが必要です。

3
Kjeld Flarup

nohup&> 2>&1&の下で行うことができます。スクリプト内にhupコマンドがありません。/Runjob.sh> sparkConcuurent.out 2>&1

1
Prem S

あなたの前のあなたのmac/linuxにBASHシェルがあるなら、あなたは実際にリダイレクションを理解するために以下のステップを試してみてください:

Zz.shという2行のスクリプトを作成します。

#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
  • Echoコマンドの出力は、STDOUTファイルストリーム(ファイル記述子1)に入ります。
  • エラーコマンドの出力はSTDERRファイルストリーム(ファイル記述子2)に入ります。

現在、単にスクリプトを実行すると、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

説明:

  • まず、STDOUT 1をzfile.txtに送信します。
  • 次に、(&1ポインターを使用して)STDERR 2をSTDOUT 1自体に送信します。
  • したがって、1と2の両方が同じファイル(zfile.txt)に入ります。

結局、バックグラウンドで実行するために、 Nohupコマンド& の中に全部を詰め込むことができます。

Nohup zz.sh 1> zfile.txt 2>&1&
0
Thyag