web-dev-qa-db-ja.com

crontabの基本に関するこの記事での「> / dev / null 2>&1」の意味は何ですか?

crontab に関する記事を読んでいます。

メールの自動送信を無効にすることについて何かがあります。

  1. 電子メールを無効にするデフォルトでは、cronジョブはcronjobを実行するユーザーアカウントに電子メールを送信します。これが必要ない場合は、cronジョブ行の最後に次のコマンドを入力します。

    >/dev/null 2>&1
    

2>&および1の詳細な意味は何ですか?これをcrontabファイルの最後に配置すると、電子メール送信機能が無効になるのはなぜですか?

146
AGamePlayer

>はリダイレクト用です

/dev/nullは、送信されたデータが破棄されるブラックホールです。

2は標準エラーのファイル記述子です

>はリダイレクト用です

&はファイル記述子の記号です(これがない場合、次の1はファイル名と見なされます)

1は、標準出力のファイル記述子です。

したがって、>/dev/null 2>&1はプログラムの出力を/dev/nullにリダイレクトします。 Standard ErrorStandard Outの両方を含めます。

Linuxドキュメンテーションプロジェクトの I/O Redirection ページで、より多くの情報を入手できます。

cronは、ジョブからの出力がある場合にのみメールを送信します。すべてがnullにリダイレクトされるため、出力はないため、cronからメールは送信されません。

226
garethTheRed

/dev/nullは、ブラックホールのように機能するデバイスファイルです。書き込まれたものは何であれ、破棄されるか消えます。出力を提供するスクリプトを実行するときに、スクリプトの最後に> /dev/null 2>&1を追加すると、スクリプトから生成されるもの(出力メッセージとエラーメッセージの両方)を書き込むようにスクリプトに要求します。 /dev/null

分割するには:

  • 2は標準エラーのハンドルまたはSTDERR
  • 1は標準出力またはSTDOUTのハンドルです

2>&1は、すべてのSTDERRSTDOUTとして送信するように求めています(つまり、スクリプトから生成されたすべてのエラーメッセージを標準出力として処理します)。これで、スクリプトの最後にすでに> /dev/nullがあり、すべての標準出力(STDOUT)が/dev/nullに書き込まれます。 STDERRSTDOUTに移動するため(2>&1のため)、STDERRSTDOUTの両方がブラックホール/dev/nullになります。つまり、スクリプトは沈黙します。

ところで、>/dev/null 2>&1の前に置く必要があります。そのはず:

x * * * * /path/to/my/script > /dev/null 2>&1
46
Sree

これは標準のI/Oリダイレクトです。

常に3つのデフォルトファイルが開いています。

  • stdin(0)
  • 標準(1)
  • stderr(2)

したがって、この例では、stdout(1)が/dev/nullにリダイレクトされています。

nullデバイスは、書き込まれたすべてのデータを破棄するデバイスファイルです。

次に、stderrはstdout(2>&1)にリダイレクトされるため、stdoutとstderrの両方が/dev/nullに移動します。

Soこれをcrontabジョブの最後に配置すると、コマンドからのすべての出力とエラーが抑制されます。

参照

I/Oリダイレクト

14
geedoubleya

マニュアルからcron(8)

コマンドを実行すると、すべての出力がcrontab […]の所有者にメールで送信されます。

したがって、あなたの記事がここで提案しているのは、出力を生成せず、したがってメールを送信しないことです。メールを無効にする別の方法(より便利ですか?)は、_-m off_オプションを使用することです。

_crond -m off
_

構文については、これはBourne Shell言語(およびbashzshなどの派生物)に固有のものです。

_[n]>file

[n]>fd
_

ファイル記述子n(または指定されていない場合は標準出力)をファイル記述子fdにリダイレクトします。

ファイル記述子は、ストリームのアドレスのファイル名にすることができます。 _&_は、C言語のアドレス演算子です。

従来、ファイル記述子_1_は標準出力(別名stdout)であり、ファイル記述子_2_は標準エラー(別名stderr)です。チャンク

_>/dev/null
_

stdoutを/ dev/nullにリダイレクトしています。

_'2>&1'
_

エラーストリームを出力ストリームにリダイレクトしています。出力ストリームは/ dev/nullにリダイレクトされています。そのため、出力は生成されず、メールも送信されません。

警告:リダイレクトの順序は重要です:

_>/dev/null 2>&1
_

と同じではありません

_2>&1 >/dev/null
_

非特権ユーザーで次の2つのコマンドを試してください。

_ls >/dev/null 2>&1
ls 2>&1 >/dev/null
_

実際、後者の場合、ファイル記述子_2_は、現在のファイル記述子 `` 1(これはstdout)の現在のアドレスに設定され、次にファイル記述子_1_は_/dev/null_にリダイレクトされます。ファイル記述子_2_がどうなっても、ファイル記述子_1_はstdoutにリダイレクトされます。

8
Ambrevar

通常、cronがcronjobを実行すると、cronjobで指定されたコマンドの出力が、cronjobを実行しているユーザーアカウントに送信されます。したがって、cronjobがuptimeを実行すると、たとえばuptimeの出力が電子メールでユーザーに送信されます。

明確にするために、コマンドの標準出力(stdout)を意味します。ここで、次のようにcornjobでコマンドuptimeを実行すると、

uptime >/dev/null 2>&1
  • 2>&1は、シャネル2(stderr)からシャネル1(stdout)へのリダイレクトを意味します。両方の出力が同じシャネル(1)になりました。
  • >/dev/null:標準出力(および標準エラー出力)が/dev/nullに送信されることを意味します。 /dev/nullは特別なファイルです:

Nullまたは0の特殊ファイルに書き込まれたデータは破棄されます。

したがって、出力を破棄し、cronは送信するものを何も持っていません。

2
chaos

リダイレクションバッシュのリファレンスマニュアルによれば、

演算子[n]>&Wordを使用して[...]出力ファイル記述子を複製しますstderrとstdoutの両方をファイルにリダイレクトするには、&> file ...の形式を使用する必要があります。

簡単に言うと、すべてのSTDERRおよびSTDOUTメッセージは/dev/nullにリダイレクトされます

1
arash javan