nohup.outを取得せずにnohupコマンドを使用するにはどうすればよいですか?


309

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

ジョブを実行すると、大量のデータが得られます。出力nohup.outが大きくなりすぎて、プロセスが遅くなります。nohup.outを取得せずにこのコマンドを実行するにはどうすればよいですか?


回答:


612

この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 | 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、出力ストリームで入力ファイル記述子を開いてプロセスを作成する必要があるため、ファイルの終わりに到達するだけでなく、読み取りを試行すると致命的な「無効なファイル記述子」エラーがトリガーされます。


1
についてnohup「プロセスが後で標準入力から何かを読み取ろうとすると、プロセスは一時停止し、フォアグラウンドに戻して何かを入力するのを待ちます。」正しくないようです。代わりに、nohup 標準入力を閉じます(フォアグラウンドで実行されている場合でも、プログラムは入力を読み取ることができません。停止されませんが、エラーコードまたはEOFを受け取ります)。
Tim

1
@Tim-その答えはLinuxでは正しいですが、標準入力を自動的に閉じない BSDまたはOS Xでは正しくあり nohupませ。これnohupは組み込みのシェルではなく、バイナリユーティリティです。
マークリード

nohupはcoreutilsの一部です。nohupLinuxとBSDまたはOS Xでは実装が異なるということですか?
Tim

はい。「coreutils」という名前はGNUパッケージを指します。しかし、BSD、OS X、SmartOS / Illumos、および多くの商用Unix(基本的に、GNUよりも古くからあるもの)には、GNU以外のコアユーティリティがあります。awk異なる、sed異なる、nohup異なる...
マークリード

なぜ「特別安全」と書いたの</dev/nullですか?0>/dev/null unix.stackexchange.com/a/266247
Tim

68
nohup some_command > /dev/null 2>&1&

これで完了です。


4
これとほぼ同じである別の回答がありましたが、最後に余分な「&」がありませんでした。
11101101b 2012年

10
&使用する必要からあなたを維持する上でctrl-c、あなたにその問題ならば、。
SunSparc 2013年

1
BGで実行する機能は非常に役立ちます
ist_lion

これはsome_command、エラーを含む出力のキャプチャに慣れていない場合にのみ役立ちます。
wulfgarpro 2017年

12

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

nohup ./yourprogram > foo.out 2> foo.err < /dev/null &

1
></ dev / nullではなく/ dev / nullにすべきではありませんか?
Scott Chu

3
@ScottChuはの< /dev/null標準入力をリダイレクトしますnohup。Linuxはこれを必要としませんが、POSIXはnohup、標準入力が端末に接続されている場合、バックグラウンドで実行できない動作を許可します。このようなシステムの例としては、BSDとOS Xのです
ミッコRantalainen

8

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.

注プログラムの作成者とは関係ありません。私はプログラムの満足しているユーザーです。


2
リンクは壊れておらず、そのgitリポジトリは古いです。現在のv0.2.3は含まれていません。
Dan D.

5

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

nohup command |tee &

このようにして、リモートサーバーでスクリプトを実行しているときにコンソール出力を取得できます。 ここに画像の説明を入力してください


4
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null"  &

sudoの出力をリダイレクトすると、sudoがパスワードを再要求するため、このバリアントを実行するには厄介なメカニズムが必要です。


1

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&

1

以下のコマンドを実行できます。

nohup <your command> & >  <outputfile> 2>&1 &

たとえば、スクリプト内にnohupコマンドがあります

./Runjob.sh > sparkConcuurent.out 2>&1
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.