cronの標準出力がPostfix Queueに溜まりすぎてサーバが危なくなった!

🌺概要

ShellScriptをcronから動かしているなら、標準出力を管理しなければいけないです。

🌺背景

或るサービスのAWSクラウドサーバを管理してます。
或る日、そのサーバのHDD容量がゼロになってしまう事項が起きました。

システムに異常な動作をしていることを見つたら、
Nagios、k1LoW/faultline の通報がバンバン来ていました。
f:id:ldhdba:20170928102408p:plain

先輩とすぐアクションを取ったのは以下の通りでした。
①❗Cakeのエラーログにセッションが書き込めないエラーが出ている
② セッションが書き込めないってことは、HDDの容量かな?
③ コマンド df すると 容量が0であることの確認
f:id:ldhdba:20170928102442p:plain

④ 容量を食うシステムではない! 👉ということはメールログかな
/var/spool 確認する 👉 ログがたまってる
⑥ 👍 メッセージのキュー削除
🔗 Postfixのメールキュー操作

f:id:ldhdba:20170928102648p:plain

ひとまず対応したけど、一体原因は何だったかな−!

🌺原因

そのサーバには、多数のShellScriptがcloneで実行されています。
また、MTAのPostfixが設置されていました。

で、各種cronで叩かれたコマンドの出力結果が
ログではなく、自動にPostfixでメール送信を試みたことですね−
特にcronの各週出力をメールに転送出来るように設定したことでは無いので、
その全てが、Postfix Queueとして溜まったことが原因でした。
f:id:ldhdba:20170928102800p:plain

Postfixとは?

f:id:ldhdba:20170928102836p:plain
IBM Public Licenseを従って、Wietse Venemaが開発した
オープンソース MTA(Mail Transfer Agent)です。
sendmailとの交換性も高いし、安全で簡単な構造を持っています。
もちろん相対的に早い速度の特徴を持っているメールサーバのサービスです。
PostfixSMTPサーバとしての機能しか持ってないので、
メールサーバとして動作させるためには、
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();
    }

f:id:ldhdba:20170928103944p:plain
👇👇👇👇👇👇👇

・拡張

<?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;
    }
}

f:id:ldhdba:20170928104046p:plain
👍👍👍👍👍

もし、知らなかった方がいらっしゃったらサーバが死ぬ前に対応しましょう!
以上です~👋