Linux管理・運用の基本
システム管理者のための実践ガイド
システム管理者のための実践ガイド
前回は、常駐デーモン clamd を使ってスキャンを高速化する方法を学びました。
しかし、いかに起動が速くなっても、スキャン実行中にCPUやディスクI/Oを占有してしまい、Webサービスのレスポンスが悪化しては本末転倒です。特にデータ量が多いサーバーでは、スキャンが数時間に及ぶこともあります。
今回は、サービスのパフォーマンスに影響を与えず、バックグラウンドで「こっそり」スキャンを終わらせる自動化テクニックを解説します。
nice と ionice を組み合わせた低優先度スキャンの実行方法systemd.timer を用いた「サーバーに優しい」定期実行設定Linuxにはプロセスの優先順位を制御する仕組みがあります。これを利用して、「他の大事な処理(WebやDB)が動いていない時にだけリソースを使う」設定にします。
| コマンド / オプション | 対象リソース | 役割 |
|---|---|---|
| nice -n 19 | CPU | 優先度を最低に設定。他のプロセスにCPUを譲ります。 |
| ionice -c 3 | ディスクI/O | Idleクラス。他のプロセスがディスクを使わない時のみ動きます。 |
これらを組み合わせることで、スキャン実行中もユーザーへのレスポンス低下を最小限に抑えられます。
自動化の前に、手動で低優先度スキャンを試してみましょう。
# /home 以下を「最低優先度」でスキャン
sudo nice -n 19 ionice -c 3 clamdscan -r -i /home
実行中、別のターミナルでWebサイトへのアクセスやコマンド操作を行い、動作が重くなっていないか確認してください。
Tips: clamdが停止している場合
clamdscanはデーモンが起動していないと動作しません。スキャンの前提として、clamav-daemonサービスが常に稼働していることを確認しましょう。
エラーに強く、メンテナンスしやすいスクリプトを作成します。
/usr/local/bin/clamav-scan.sh として保存します。
#!/bin/bash
# エラー発生時に中断、未定義変数を防止する安全設定
set -euo pipefail
# スキャン対象ディレクトリ
SCAN_DIR="/var/www/html /home"
# 隔離先
QUARANTINE_DIR="/var/lib/clamav/quarantine"
# ログファイル
LOG_FILE="/var/log/clamav/periodic_scan.log"
# CPUとディスクの優先度を下げて実行
# スクリプト内で nice/ionice を指定することで、確実な制御を行います
nice -n 19 ionice -c 3 clamdscan -r -i "$SCAN_DIR" \
--move="$QUARANTINE_DIR" \
--log="$LOG_FILE"
作成後、sudo chmod +x /usr/local/bin/clamav-scan.sh で実行権限を付与してください。
モダンなLinux運用に合わせて、systemd.timer でスケジュール管理を行います。
/etc/systemd/system/clamav-scan.service
[Unit]
Description=ClamAV Periodic Scan
After=clamav-daemon.service
[Service]
Type=simple
ExecStart=/usr/local/bin/clamav-scan.sh
# サービス側でも二重に優先度を制限し、安全性を高める
CPUSchedulingPolicy=idle
IOSchedulingClass=idle
/etc/systemd/system/clamav-scan.timer
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
[Install]
WantedBy=timers.target
設定後、sudo systemctl daemon-reload を行い、sudo systemctl enable --now clamav-scan.timer で有効化します。
periodic_scan.log)が膨大な場合は、grep "FOUND" を実行するだけで、感染ファイルを素早く特定できます。/var/www、火曜は /home」のようにスクリプトやタイマーを分割し、負荷を分散させましょう。第4回では、サービスへの影響を最小限に抑えた定期スキャンの自動化を学びました。
nice と ionice を使い、CPUとディスク負荷を徹底的に下げる。set -euo pipefail で、自動実行時の予期せぬエラーに対処する。この記事で、日常的な運用を「自動操縦」にする準備が整いました。
しかし、定期スキャンだけでは「ファイルが置かれてから検知されるまで」のタイムラグが発生します。もっと早く、例えば開発者がコードをプッシュした瞬間に検査することはできないでしょうか?
次回は「運用編・Gitサーバー」として、開発現場で必須の Git Hooks と連携し、コードがプッシュされた瞬間に自動検査する仕組みを解説します。ご覧いただきありがとうございました。