はじめに#
こんにちは!今回はbatchコマンドについて解説します。
batchは、システムの負荷が低いときに自動的にコマンドを実行するコマンドです。atコマンドと違って「今すぐ実行」ではなく「暇な時に実行」という感じ。サーバーの負荷が高い時間帯に重い処理を避けたい時に超便利ですね。
バックアップやデータ分析、ログ処理など、重い処理を夜間に自動実行する際に活躍します。
batchコマンドとは#
batchは、システムの負荷が低くなったときに一度だけコマンドを実行する外部コマンドです。“batch processing"から来ていますね。
atコマンドとよく似ていますが、実行時刻を指定する代わりに、システムの平均ロードが1.0以下になったときに実行されます。つまり、他のプロセスが少ないタイミングを自動的に判断して実行してくれるんです。
基本構文#
実際には対話形式でコマンドを入力します。通常は以下のように使います:
または対話形式で:
1
2
3
|
batch
# プロンプトでコマンド入力
# Ctrl+Dで終了
|
主なオプション#
| オプション |
説明 |
-f |
ファイルからコマンドを読み込む |
-m |
コマンド実行後、メールで通知 |
-q |
キュー指定(a-zの優先度) |
-v |
実行予定情報を詳細表示 |
使用例#
例1: 基本的な使い方#
1
|
echo "tar -czf /backup/data.tar.gz /var/data" | batch
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 1 at Fri Jan 3 13:25:00 2026 b
|
システムの負荷が低くなったときに自動実行されます。
例2: メール通知付きで実行#
1
|
echo "backup.sh" | batch -m
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 2 at Fri Jan 3 13:26:00 2026 b
|
実行完了後にメール通知が送られます。
例3: ファイルのコマンドを実行#
1
2
3
4
5
6
7
|
cat << 'EOF' > /tmp/heavy_process.sh
#!/bin/bash
find / -name "*.log" -mtime +30 -delete
du -sh /var/log > /tmp/logsize.txt
EOF
batch -f /tmp/heavy_process.sh
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 3 at Fri Jan 3 13:27:00 2026 b
|
複雑な処理はファイルに書いて実行。
例4: 複数のコマンドを実行#
1
2
3
4
5
|
cat << 'EOF' | batch
cd /var/log
gzip access.log
gzip error.log
EOF
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 4 at Fri Jan 3 13:28:00 2026 b
|
複数のコマンドを順序実行します。
例5: 大容量ファイルのコピー#
1
|
echo "cp -r /source /destination" | batch
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 5 at Fri Jan 3 13:29:00 2026 b
|
I/Oが多い処理は負荷が低い時に実行。
例6: データベースのダンプ#
1
|
echo "mysqldump -u root -p database > /backup/db.sql" | batch
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 6 at Fri Jan 3 13:30:00 2026 b
|
大量データのダンプは負荷が低い時間に。
例7: ログの分析と圧縮#
1
2
3
4
5
6
7
8
|
cat << 'EOF' | batch -m
#!/bin/bash
logdir="/var/log"
for logfile in $logdir/*.log; do
[ -f "$logfile" ] && gzip "$logfile"
done
echo "Log compression completed" | mail -s "Batch Completed" [email protected]
EOF
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 7 at Fri Jan 3 13:31:00 2026 b
|
複雑なログ処理を自動化。
例8: ユーザーディスク使用量の確認#
1
|
echo "du -sh /home/* | sort -hr" | batch
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 8 at Fri Jan 3 13:32:00 2026 b
|
ディスク分析は時間がかかるので、負荷が低い時に実行。
例9: ファイルの同期#
1
|
echo "rsync -av /data1 /data2" | batch
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 9 at Fri Jan 3 13:33:00 2026 b
|
ネットワークI/Oが多い同期処理を優先度低く。
例10: インデックスの再構築#
1
|
echo "mysql -u root -e 'OPTIMIZE TABLE table_name;'" | batch -m
|
実行結果:
1
2
|
warning: commands will be executed using /bin/sh
job 10 at Fri Jan 3 13:34:00 2026 b
|
データベース最適化は負荷が低い時に実行。
Tips・注意点#
atデーモンの起動確認#
batchもatデーモン(atd)上で動作します。
1
2
|
systemctl status atd
sudo systemctl start atd
|
atとbatchの違い#
1
2
3
4
5
|
# at: 指定時刻に実行(時間指定)
at 22:00
# batch: 負荷が低い時に実行(自動判断)
batch
|
実行時刻を指定する必要がないのがbatchの特徴。
batchのキューについて#
1
2
3
4
5
|
# デフォルトはbキュー
batch
# atと同じaキューを使う場合
batch -q a
|
batchはbキューを使い、atと区別されます。
ロードアベレージの確認#
1
2
|
uptime
# load average: 0.5, 0.3, 0.2
|
batchはロードアベレージが1.0以下の時に実行されます。
実践的な使い方#
夜間に重いバックアップを自動実行#
1
2
3
4
5
6
7
8
|
cat << 'EOF' | batch
#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
tar -czf ${BACKUP_DIR}/backup_${DATE}.tar.gz /var/www /var/mysql
md5sum ${BACKUP_DIR}/backup_${DATE}.tar.gz > ${BACKUP_DIR}/backup_${DATE}.md5
echo "Backup completed" | mail -s "Batch Backup Report" [email protected]
EOF
|
I/Oが大きいバックアップは負荷が低い時に実行。
定期的なメンテナンスタスク#
1
2
3
4
5
6
7
8
9
|
cat << 'EOF' | batch -m
#!/bin/bash
# キャッシュクリア
rm -rf /var/cache/*
# 一時ファイルを削除
find /tmp -mtime +7 -delete
# ディスク使用量をレポート
du -sh / > /tmp/disk_usage.txt
EOF
|
複数のメンテナンス処理を負荷が低い時に実行。
ログローテーション#
1
|
echo "logrotate /etc/logrotate.conf" | batch
|
大量ログの処理は負荷が低い時が最適。
システム最適化#
1
2
3
4
5
6
7
8
|
cat << 'EOF' | batch
#!/bin/bash
sync # キャッシュをディスクに書き込み
# ファイルシステムチェック(読み取り専用)
fsck -n /dev/sda1
# システムメモリ状況をレポート
free -h > /tmp/memory_report.txt
EOF
|
システム最適化処理も負荷が低い時が良い。
まとめ#
batchコマンドのポイント:
- システムの負荷が低くなったときに自動実行する
- atコマンドと異なり、実行時刻を指定しない
- ロードアベレージが1.0以下になると実行開始
-f: ファイルからコマンド読み込み
-m: 実行完了後メール通知
- atデーモン(atd)の起動が必須
- よく使う組み合わせ:
batch -m, batch -f script.sh
I/Oが多い処理や時間がかかる処理は、batchで「暇な時に自動実行」するようにすると、サーバー負荷を分散できて効率的ですよ!