Sota411 ← Back
← Back to Articles

2026-06-01

pacmanの自動更新をcronからanacronへ移した

やりたかったこと

Arch Linux のパッケージ更新を自動で回すために, root の crontab に次の設定を入れていた.

cron0 3 * * * /usr/bin/pacman -Syu --noconfirm

毎日 03:00 に pacman -Syu --noconfirm を実行する設定である. 実際に動作していることは cronie のログと /var/log/pacman.log で確認した.

textJun 01 03:00:00 lenovo-pc CROND[1094562]: (root) CMD (/usr/bin/pacman -Syu --noconfirm)
Jun 01 03:01:08 lenovo-pc CROND[1094559]: (root) CMDEND (/usr/bin/pacman -Syu --noconfirm)
text[2026-06-01T03:00:00+0900] [PACMAN] Running '/usr/bin/pacman -Syu --noconfirm'
[2026-06-01T03:00:24+0900] [ALPM] transaction completed

問題は, cron は指定時刻にマシンが起動していないとその回の実行が飛ぶことだった. 自分の PC は常時稼働サーバーではないので, 03:00 固定よりも「1日1回, 実行可能な時間帯に起動していれば実行する」ほうが目的に合っている.

anacronを使う理由

anacron は日単位の周期でコマンドを実行するための仕組みで, cron と違ってマシンが常時起動している前提を置かない. Arch manual pages でも does not assume that the machine is running continuously と説明されている.

今回の目的は「03:00 ちょうどに実行すること」ではなく, 「03:00 から 22:00 の間に起動していれば日次更新が走ること」だった. そのため, root crontab に時刻固定で書くより, 既存の /etc/anacrontab が呼び出す /etc/cron.daily に置く方針にした.

この環境の /etc/anacrontab は次の内容だった.

textSHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45
START_HOURS_RANGE=3-22

1	5	cron.daily		nice run-parts /etc/cron.daily
7	25	cron.weekly		nice run-parts /etc/cron.weekly
@monthly 45	cron.monthly		nice run-parts /etc/cron.monthly

cron.daily は 1 日周期で, 基本の 5 分遅延に加えて RANDOM_DELAY=45 の範囲で追加遅延が乗る. 実行可能な時間帯は START_HOURS_RANGE=3-22 なので, この設定では 03:00 から 22:00 の間に日次ジョブが走る. この時間帯を丸ごと逃した日は, anacrontab(5) の説明どおりその日のジョブは実行されない.

移行内容

まず /etc/cron.daily/pacman-system-upgrade を作った.

sh#!/bin/sh
set -eu

exec /usr/bin/pacman -Syu --noconfirm

set -eu を入れて, 未定義変数や途中失敗を隠さないようにした. 最後は execpacman に置き換えているので, pacman の終了ステータスがそのままジョブの終了ステータスになる.

次に, root crontab から同じ更新処理を消した. 同じ pacman -Syu が cron と anacron の両方から走ると二重実行になるためである.

移行後の root crontab は空になった.

textno crontab for root

確認したこと

run-parts --test /etc/cron.daily で, 追加したスクリプトが日次ジョブとして拾われることを確認した.

text/etc/cron.daily/pacman-system-upgrade

スクリプト自体の権限も確認した.

text-rwxr-xr-x 1 root root 57 Jun  1 03:48 /etc/cron.daily/pacman-system-upgrade

さらに anacron -T/etc/anacrontab の構文検査を通した. anacron -T は設定ファイルが有効なら終了コード 0 を返すため, 今回の設定は構文上問題なかった.

最後に sh -n /etc/cron.daily/pacman-system-upgrade でシェルスクリプトの構文も確認した.

注意点

pacman --noconfirm は確認を飛ばすため, 手元でログを見る前提の設定である. pacman の manual でも --noconfirm は確認メッセージを迂回するオプションで, スクリプトから実行したい場合以外は良い考えではないと説明されている.

そのため, この設定は「自分の Arch Linux PC で, pacman ログを後から確認する」用途に限定している. 管理対象が複数台ある場合や, 失敗通知まで含めたい場合は, systemd timer と dedicated service に分けた方が追跡しやすい.

参考

← トップページに戻る