cronの標準出力がPostfix Queueに溜まりすぎてサーバが危なくなった!
🌺概要
ShellScriptをcronから動かしているなら、標準出力を管理しなければいけないです。
🌺背景
或るサービスのAWSクラウドサーバを管理してます。
或る日、そのサーバのHDD容量がゼロになってしまう事項が起きました。
システムに異常な動作をしていることを見つたら、
Nagios、k1LoW/faultline の通報がバンバン来ていました。
先輩とすぐアクションを取ったのは以下の通りでした。
①❗Cakeのエラーログにセッションが書き込めないエラーが出ている
② セッションが書き込めないってことは、HDDの容量かな?
③ コマンド df
すると 容量が0であることの確認
④ 容量を食うシステムではない! 👉ということはメールログかな
⑤ /var/spool
確認する 👉 ログがたまってる
⑥ 👍 メッセージのキュー削除
🔗 Postfixのメールキュー操作
ひとまず対応したけど、一体原因は何だったかな−!
🌺原因
そのサーバには、多数のShellScriptがcloneで実行されています。
また、MTAのPostfixが設置されていました。
で、各種cronで叩かれたコマンドの出力結果が
ログではなく、自動にPostfixでメール送信を試みたことですね−
特にcronの各週出力をメールに転送出来るように設定したことでは無いので、
その全てが、Postfix Queueとして溜まったことが原因でした。
※ Postfixとは?
IBM Public Licenseを従って、Wietse Venemaが開発した
オープンソース MTA(Mail Transfer Agent)です。
sendmailとの交換性も高いし、安全で簡単な構造を持っています。
もちろん相対的に早い速度の特徴を持っているメールサーバのサービスです。
PostfixはSMTPサーバとしての機能しか持ってないので、
メールサーバとして動作させるためには、
POPサーバやIMAPサーバが別途に必要になるかもしれません。
🌺解決
各ShellScriptの必要なログとエラーのログは別のログファイルで管理しています。
なので、そもそもその標準出力は要らなかったです。
で、私はcronから実行される各種ShellScriptの標準出力を切る方式を選びました。
方法は、大きく2つありました。
① cronにコマンドを追加する
方法は簡単です。
crontabで >/dev/null 2>&1
ってコマンドを追加することだけです。
* * * * * /usr/bin/sh /.../*.sh > /dev/null 2>&1
※コマンド>/dev/null 2>&1
とは?
エラー出力(1)を含めた標準出力(2)をゴミ箱(/dev/null) に入れます
という意味でございます。
② ShellScriptの標準出力を切る (CakePHP3 Shell)
CakePHP3の Cake\Console\Shell
を拡張します。
・まず、CakePHP3 の CakeShellの基本標準出力
// Cake\Console\Shell /** * Displays a header for the shell * * @return void */ protected function _welcome() { $this->out(); $this->out(sprintf('<info>Welcome to CakePHP %s Console</info>', 'v' . Configure::version())); $this->hr(); $this->out(sprintf('App : %s', APP_DIR)); $this->out(sprintf('Path: %s', APP)); $this->out(sprintf('PHP : %s', phpversion())); $this->hr(); }
👇👇👇👇👇👇👇
・拡張
<?php namespace App\Shell; use Cake\Console\Shell; class AppShell extends Shell { /** * overriding the parent method * stop to the welcome stdoutput for postfix. * * @author lee */ protected function _welcome() { return; } }
👍👍👍👍👍
もし、知らなかった方がいらっしゃったらサーバが死ぬ前に対応しましょう!
以上です~👋