crontab に関する記事を読んでいます。
メールの自動送信を無効にすることについて何かがあります。
電子メールを無効にするデフォルトでは、cronジョブはcronjobを実行するユーザーアカウントに電子メールを送信します。これが必要ない場合は、cronジョブ行の最後に次のコマンドを入力します。
>/dev/null 2>&1
2
>
&
および1
の詳細な意味は何ですか?これをcrontabファイルの最後に配置すると、電子メール送信機能が無効になるのはなぜですか?
>
はリダイレクト用です
/dev/null
は、送信されたデータが破棄されるブラックホールです。
2
は標準エラーのファイル記述子です
>
はリダイレクト用です
&
はファイル記述子の記号です(これがない場合、次の1
はファイル名と見なされます)
1
は、標準出力のファイル記述子です。
したがって、>/dev/null 2>&1
はプログラムの出力を/dev/null
にリダイレクトします。 Standard Error
とStandard Out
の両方を含めます。
Linuxドキュメンテーションプロジェクトの I/O Redirection ページで、より多くの情報を入手できます。
cron
は、ジョブからの出力がある場合にのみメールを送信します。すべてがnull
にリダイレクトされるため、出力はないため、cron
からメールは送信されません。
/dev/null
は、ブラックホールのように機能するデバイスファイルです。書き込まれたものは何であれ、破棄されるか消えます。出力を提供するスクリプトを実行するときに、スクリプトの最後に> /dev/null 2>&1
を追加すると、スクリプトから生成されるもの(出力メッセージとエラーメッセージの両方)を書き込むようにスクリプトに要求します。 /dev/null
。
分割するには:
2
は標準エラーのハンドルまたはSTDERR
1
は標準出力またはSTDOUT
のハンドルです2>&1
は、すべてのSTDERR
をSTDOUT
として送信するように求めています(つまり、スクリプトから生成されたすべてのエラーメッセージを標準出力として処理します)。これで、スクリプトの最後にすでに> /dev/null
があり、すべての標準出力(STDOUT
)が/dev/null
に書き込まれます。 STDERR
はSTDOUT
に移動するため(2>&1
のため)、STDERR
とSTDOUT
の両方がブラックホール/dev/null
になります。つまり、スクリプトは沈黙します。
ところで、>
は/dev/null 2>&1
の前に置く必要があります。そのはず:
x * * * * /path/to/my/script > /dev/null 2>&1
これは標準のI/Oリダイレクトです。
常に3つのデフォルトファイルが開いています。
したがって、この例では、stdout(1
)が/dev/null
にリダイレクトされています。
null
デバイスは、書き込まれたすべてのデータを破棄するデバイスファイルです。
次に、stderrはstdout(2>&1
)にリダイレクトされるため、stdoutとstderrの両方が/dev/null
に移動します。
Soこれをcrontabジョブの最後に配置すると、コマンドからのすべての出力とエラーが抑制されます。
参照
マニュアルからcron(8):
コマンドを実行すると、すべての出力がcrontab […]の所有者にメールで送信されます。
したがって、あなたの記事がここで提案しているのは、出力を生成せず、したがってメールを送信しないことです。メールを無効にする別の方法(より便利ですか?)は、_-m off
_オプションを使用することです。
_crond -m off
_
構文については、これはBourne Shell言語(およびbash
、zsh
などの派生物)に固有のものです。
_[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にリダイレクトされます。
通常、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は送信するものを何も持っていません。
リダイレクションバッシュのリファレンスマニュアルによれば、
演算子[n]>&Wordを使用して[...]出力ファイル記述子を複製しますstderrとstdoutの両方をファイルにリダイレクトするには、&> file ...の形式を使用する必要があります。
簡単に言うと、すべてのSTDERRおよびSTDOUTメッセージは/dev/null
にリダイレクトされます