インフラエンジニアの羅針盤

インフラエンジニア1〜3年目のための技術ガイド

Linuxジョブ定期実行(cron/at)とロケール・文字コード設定の仕組み【LinuC102】

公開
,
LinuC Level 1 第13回 主題1.08 システムサービス



Linuxサーバーの自律運用を支える中核機能が、指定時刻にコマンドを自動実行する「ジョブスケジューリング」と、多言語やタイムゾーンを統制する「ローカリゼーション」です。LinuC 102試験の主題1.08「管理業務」では、定期実行デーモンcronと不定期稼働向けanacron、1回限り実行のat、そしてシステムロケール環境変数(LANG, LC_ALL)や文字コード変換(iconv)が重要度合計7で問われます。本稿では、記述式問題(コマ問)の定番であるcrontabの日時指定規則からロケール優先順位までを、実機検証ログとともに論理的に解説します。

  • ユーザーcrontab(5フィールド)とシステムcrontab(/etc/crontab: 6フィールド)の日時指定構文およびユーザー名指定の有無を説明できる状態を目指します
  • 常時稼働サーバー向けcronと非稼働期間を考慮するanacronのアーキテクチャの相違を理解します
  • 1回限定ジョブ実行コマンド(at, atq, atrm, batch)の操作手法とアクセス制御(cron.allow, cron.deny)を把握します
  • ロケール環境変数の階層構造と優先順位(LC_ALL > 個別LC_* > LANG)、およびトラブル調査におけるLANG=Cの実践的活用法を習得します
  • iconvコマンドを用いたテキストファイルの文字コード変換、およびtimedatectlによるタイムゾーン設定手順を身につけます
項目 仕様・設定値
検証機ホスト名 linuc-node01
ディストリビューション AlmaLinux 9.8 (Olive Jaguar)
cron実装デーモン cronie 1.5.7 (crond.service)
システムロケール ja_JP.UTF-8(localectl 設定値)
タイムゾーン Asia/Tokyo (JST, +0900)
対象試験 LinuC レベル1 102試験(主題1.08.2 重要度4 / 主題1.08.3 重要度3)
目次
  1. 1. 定期ジョブ自動実行システム:cronとcrontab
    1. 1.1 cronデーモン(crond)の稼働アーキテクチャ
    2. 1.2 ユーザーcrontab(5フィールド)の記法と日時指定ルール
    3. 1.3 システムcrontab(/etc/crontab: 6フィールド)と /etc/cron.d/
    4. 1.4 crontabコマンドのオプション(-e, -l, -r, -u)と誤爆防止策
    5. 1.5 cron利用のアクセス制御(/etc/cron.allow と /etc/cron.deny)
  2. 2. 不定期稼働システム向けスケジューラ:anacron
    1. 2.1 anacronの仕組みとcronとの設計思想の相違
    2. 2.2 設定ファイル(/etc/anacrontab)の書式
    3. 2.3 日次・週次・月次ジョブディレクトリ
  3. 3. 一回限りのジョブ実行:atコマンドとキュー管理
    1. 3.1 atコマンドによる実行予約の指定書式
    2. 3.2 予約ジョブの確認(atq)と削除(atrm)
    3. 3.3 システム低負荷時のみ実行するbatchコマンド
    4. 3.4 at利用のアクセス制御(/etc/at.allow と /etc/at.deny)
  4. 4. システムローカリゼーションとロケール環境変数
    1. 4.1 ロケール識別子の構造
    2. 4.2 ロケール関連環境変数の優先順位
    3. 4.3 調査用英語ロケール(LANG=C / LC_ALL=C)の実践活用
    4. 4.4 localeコマンドと利用可能ロケール一覧
    5. 4.5 localectlによるシステムロケールの恒久設定
  5. 5. 文字コード変換(iconv)とタイムゾーン管理
    1. 5.1 テキストファイルの文字コード変換(iconv)
    2. 5.2 タイムゾーン設定ファイル(/etc/localtime)
    3. 5.3 timedatectlおよびtzselectによるタイムゾーン変更
  6. 6. 実機ハンズオン演習:AlmaLinux 9でcron登録とロケール切り替えを検証
    1. 6.1 実機検証環境の確認
    2. 6.2 演習1:ユーザーcrontabの登録・確認・安全な運用
    3. 6.3 演習2:LANG=Cによる英語メッセージ出力切り替えの検証
    4. 6.4 演習3:iconvを用いたUTF-8とShift_JIS間の相互変換
  7. 7. LinuC 102試験対策まとめとコマ問頻出チェック
    1. 7.1 cron日時フィールド・ロケール変数完全対比表
    2. 7.2 コマ問(記述式)頻出キーワード一覧表
    3. 7.3 Ping-t演習へのブリッジ(対象分野と推奨学習順)
  8. 8. まとめと次回予告

1. 定期ジョブ自動実行システム:cronとcrontab

Linuxシステムにおいて、設定された日時に従ってバックグラウンドで処理を反復実行する基幹デーモンがcrondです。

crontab日時指定フィールド構造とシステムユーザー設定の差異
図1: crontab 日時指定フィールド構造とシステム/ユーザー設定の差異

1.1 cronデーモン(crond)の稼働アーキテクチャ

crondサービスは常駐デーモンとして毎分00秒に起動し、設定テーブル(crontab)を走査して現在の日時と一致するジョブが存在するかを検査します。一致したジョブがあれば、独立した子プロセスを立ち上げてシェル経由でコマンドを実行します。

1.2 ユーザーcrontab(5フィールド)の記法と日時指定ルール

一般ユーザーやrootが自身の権限でタスクを定期実行する場合、crontab -eコマンドで編集します。この設定テーブルは空白区切りで「5つの日時フィールド」と「実行コマンド」で構成されます。

分  時  日  月  曜日  実行コマンド
┬   ┬   ┬   ┬   ┬
│   │   │   │   └─ 曜日(0〜7: 0と7は日曜日、1=月、2=火...6=土)
│   │   │   └───── 月(1〜12 または jan, feb...)
│   │   └───────── 日(1〜31)
│   └───────────── 時(0〜23)
└───────────────── 分(0〜59)

日時フィールドで利用可能な特殊記号:

  • *(アスタリスク): すべての数値(毎分、毎時、毎日など)に合致。
  • ,(カンマ): 複数の数値を列挙(例: 10,40 は10分と40分)。
  • -(ハイフン): 範囲を指定(例: 9-18 は9時から18時まで、曜日 1-5 は月曜から金曜)。
  • /(スラッシュ): 間隔(ステップ値)を指定(例: */15 は15分ごと、0-23/2 は2時間ごと)。

1.3 システムcrontab(/etc/crontab: 6フィールド)と /etc/cron.d/

システム管理者向けに用意された全システム共通の定期実行設定ファイルが /etc/crontab です。ユーザーcrontabとの決定的な相違点は、「第6列にコマンドを実行するユーザー名が必須となる」ことです。

# /etc/crontab の実機定義書式
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12)
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
  0  3  1  *  * root       /usr/local/bin/monthly_audit.sh

また、RPMパッケージ等で導入されたソフトウェアが独自にcron設定を配置する場所として /etc/cron.d/ ディレクトリがあり、ここにも /etc/crontab と同一の「6フィールド形式」のファイルが配置されます。

1.4 crontabコマンドのオプション(-e, -l, -r, -u)と誤爆防止策

  • crontab -e: カレントユーザーのcrontabをエディタで編集。
  • crontab -l: カレントユーザーのcrontab内容を表示(List)。
  • crontab -r: カレントユーザーのcrontabを確認なしで全消去(Remove)
  • crontab -u <user>: (rootのみ)特定ユーザーのcrontabを指定して操作。

危険性の高い運用注意点:キーボード上で -e(編集)と -r(全削除)は隣接しています。crontab -e と打つ意図で誤って crontab -r を実行すると、苦労して記述した定期ジョブが一瞬で消失します。実務では crontab -l > mycron.bak とバックアップを取得してから編集するか、-i(削除時に対話確認プロンプトを出す)オプションを併用することが推奨されます。

1.5 cron利用のアクセス制御(/etc/cron.allow と /etc/cron.deny)

一般ユーザーによるcron利用を制御するセキュリティ設定です。

  • /etc/cron.allow が存在する場合: cron.allow に記載されたユーザーのみがcronを利用できます(cron.deny は存在しても無視されます)。
  • /etc/cron.allow が存在せず、/etc/cron.deny のみ存在する場合: cron.deny に記載されたユーザー以外の全ユーザーがcronを利用できます。
  • 両ファイルとも存在しない場合: ディストリビューションの仕様に依存しますが、通常はrootのみがcronを利用可能となります。

2. 不定期稼働システム向けスケジューラ:anacron

夜間や休日に電源が落とされるクライアントPCや一時停止する仮想マシンでは、指定時刻に電源が入っていなければ cron の定期ジョブがスキップされてしまいます。この課題を解決するのが anacron です。

2.1 anacronの仕組みとcronとの設計思想の相違

anacron はデーモンとして常駐せず、OS起動時やcronから呼び出されて実行されます。前回のジョブ実行日時をタイムスタンプファイル(/var/spool/anacron/ 配下)で追跡し、「指定された期間内にジョブが実行されていない」ことを検知すると、マシンが起動した段階で遅れて自動実行します。

2.2 設定ファイル(/etc/anacrontab)の書式

/etc/anacrontab の各行は4つのフィールドで記述されます。

# 頻度(日数) 遅延(分) ジョブ識別子 コマンド
1             5          cron.daily    run-parts /etc/cron.daily
7             25         cron.weekly   run-parts /etc/cron.weekly
@monthly      45         cron.monthly  run-parts /etc/cron.monthly
  • 頻度(日数): 実行間隔(日単位)。1は毎日、7は毎週、@monthlyは月1回。
  • 遅延(分): システム起動直後の高負荷を避けるため、起動から何分待機して実行するか。
  • ジョブ識別子: /var/spool/anacron/ に保存されるタイムスタンプ記録名。
  • コマンド: 実行する処理。通常は run-parts スクリプトを用いてディレクトリ配下を一括実行。

2.3 日次・週次・月次ジョブディレクトリ

/etc/cron.daily//etc/cron.weekly//etc/cron.monthly//etc/cron.hourly/ ディレクトリ内に実行可能スクリプトを配置しておくだけで、細かな日時設定を行うことなく自動実行対象に組み込まれます。

3. 一回限りのジョブ実行:atコマンドとキュー管理

反復実行ではなく、「今夜の午前2時に一度だけバッチスクリプトを流したい」といった用途には at コマンドを用います(atd デーモンの稼働が必要)。

3.1 atコマンドによる実行予約の指定書式

at コマンドに対象時刻を指定して実行すると、対話プロンプト(at>)に移行します。実行したいコマンドを複数行入力し、最後に Ctrl+D(EOF)を押下して予約を完了します。

[user01@linuc-node01 ~]$ at 18:00
at> /home/user01/scripts/cleanup.sh
at> echo "完了通知" | mail -s "Job Done" user01
at> <EOT>
job 1 at Tue Sep  8 18:00:00 2026

多様な時刻指定表現:

  • at 23:30 tomorrow: 明日の23時30分
  • at now + 2 hours: 現在時刻から2時間後
  • at 9:00 AM next week: 来週の午前9時

3.2 予約ジョブの確認(atq)と削除(atrm)

  • atq(または at -l): 現在待機している予約ジョブの一覧とジョブ番号を表示。
  • atrm <job_id>(または at -d <job_id>): 指定したジョブ番号の予約を取り消し・削除。

3.3 システム低負荷時のみ実行するbatchコマンド

batch コマンドは、時刻ではなく「システムのロードアベレージが一定水準(通常0.8未満)を下回って負荷が軽くなったタイミング」を見計らって一回限り実行するスケジューリングコマンドです。

3.4 at利用のアクセス制御(/etc/at.allow と /etc/at.deny)

cronと同様の制御論理です。at.allow があればそのユーザーのみ、なければ at.deny の登録者以外が利用可能です。

4. システムローカリゼーションとロケール環境変数

システムの言語、通貨記号、日付表記、文字エンコーディングなどの地域化設定を「ロケール(Locale)」と呼びます。

Linuxロケール環境変数の優先順位ツリーと文字コード変換
図2: Linux ロケール環境変数の優先順位ツリーと文字コード変換

4.1 ロケール識別子の構造

ロケールは以下の命名規約で表されます。

言語コード_地域コード.文字エンコーディング
ja_JP.UTF-8
en_US.UTF-8

4.2 ロケール関連環境変数の優先順位

ロケールを決定する環境変数には厳格な優先順位が存在します。試験で頻出する関係式です。

  • 第1優先(最上位): LC_ALL

    この変数が設定されている場合、後述の個別 LC_*LANG の設定をすべて無条件に上書きします。

  • 第2優先(個別カテゴリ): 各種 LC_* 変数

    LC_ALL が未定義の場合、項目ごとに個別の設定が適用されます。

    • LC_MESSAGES: コマンドの出力メッセージやエラー文の表示言語
    • LC_TIME: 日付や時刻の表示書式(24時間表記や月名など)
    • LC_CTYPE: 文字の分類(アルファベット、ひらがな等)と大文字小文字変換
    • LC_COLLATE: 文字列のソート(照合)順序
  • 第3優先(基本既定値): LANG

    LC_ALL も該当する個別の LC_* も指定されていない場合に参照されるフォールバック既定値です。

4.3 調査用英語ロケール(LANG=C / LC_ALL=C)の実践活用

日本語環境(ja_JP.UTF-8)では、エラーメッセージが日本語で出力されるため、Web検索で類似事例を探す際や、スクリプトで出力をawk等でパースする際に不都合が生じます。

一時的に標準英語(POSIX互換Cロケール)でコマンドを実行するには、コマンドの先頭に環境変数を付与します。

# 一時的に英語メッセージで実行
[user01@linuc-node01 ~]$ LANG=C systemctl status crond
# または
[user01@linuc-node01 ~]$ LC_ALL=C ls -l /nonexistent
ls: cannot access '/nonexistent': No such file or directory

4.4 localeコマンドと利用可能ロケール一覧

  • locale: 現在設定されているロケール環境変数の一覧を表示。
  • locale -a: システムにインストールされている、利用可能な全ロケール名の一覧を出力(All)。

4.5 localectlによるシステムロケールの恒久設定

systemd環境において、システム全体のロケール設定ファイル(/etc/locale.conf)を安全に更新・管理するコマンドが localectl です。

# 現在の設定確認
[user01@linuc-node01 ~]$ localectl status

# 日本語UTF-8へ恒久変更
[user01@linuc-node01 ~]$ sudo localectl set-locale LANG=ja_JP.UTF-8

5. 文字コード変換(iconv)とタイムゾーン管理

異なる文字コードで作成されたレガシーテキストの変換と、OSの時計が準拠するタイムゾーンの統制手順です。

5.1 テキストファイルの文字コード変換(iconv)

Windows由来のShift_JIS(CP932)や旧LinuxのEUC-JPで書かれたファイルをUTF-8に変換する標準コマンドが iconv です。

# 書式: iconv -f 変換元コード -t 変換先コード [-o 出力ファイル] 入力ファイル
[user01@linuc-node01 ~]$ iconv -f SHIFT-JIS -t UTF-8 -o utf8_doc.txt sjis_doc.txt
  • -f <encoding>: 変換前の文字コード(From)
  • -t <encoding>: 変換後の文字コード(To)
  • -o <output_file>: 出力先ファイル名(省略時は標準出力へ出力)
  • -l: 利用可能な全文字コード一覧を表示(List)

5.2 タイムゾーン設定ファイル(/etc/localtime)

システムのローカル時刻の基準は、/etc/localtime ファイルによって決定されます。このファイルの実体は、タイムゾーンデータベース(/usr/share/zoneinfo/)配下の該当地域ファイル(例: /usr/share/zoneinfo/Asia/Tokyo)へのシンボリックリンクです。

5.3 timedatectlおよびtzselectによるタイムゾーン変更

  • timedatectl: systemdにおける現在時刻、タイムゾーン、NTP同期状態の確認・設定ツール。
    [user01@linuc-node01 ~]$ timedatectl status
    [user01@linuc-node01 ~]$ sudo timedatectl set-timezone Asia/Tokyo
  • tzselect: 対話型メニュー形式で地域(大陸➔国➔都市)を選択し、対応するタイムゾーン文字列(Asia/Tokyo等)を画面に出力する補助ツール(設定ファイル自体は変更しません)。

6. 実機ハンズオン演習:AlmaLinux 9でcron登録とロケール切り替えを検証

実機linuc-node01を用いて、cron構文の確認とロケールの一時的切り替え動作を検証します。

6.1 実機検証環境の確認

crondサービスの稼働状態とタイムゾーン設定を確認します。

[user01@linuc-node01 ~]$ systemctl is-active crond
active

[user01@linuc-node01 ~]$ timedatectl
               Local time: 火 2026-09-08 07:20:12 JST
           Universal time: 月 2026-09-07 22:20:12 UTC
                Time zone: Asia/Tokyo (JST, +0900)

6.2 演習1:ユーザーcrontabの登録・確認・安全な運用

テスト用の定期実行エントリを安全に登録し、一覧確認を行った後に削除します。

# 1. 現在のcrontabを確認(未登録状態)
[user01@linuc-node01 ~]$ crontab -l
no crontab for user01

# 2. 一時ファイル経由で安全に登録(誤った -r 防止)
[user01@linuc-node01 ~]$ cat << 'EOF' > /tmp/mycron.txt
# 毎日午前3時15分にバックアップスクリプトを実行
15 3 * * * /usr/bin/echo "cron test" >> /tmp/cron_test.log
EOF

# 3. ファイルからcrontabへロード
[user01@linuc-node01 ~]$ crontab /tmp/mycron.txt

# 4. 登録内容を確認
[user01@linuc-node01 ~]$ crontab -l
# 毎日午前3時15分にバックアップスクリプトを実行
15 3 * * * /usr/bin/echo "cron test" >> /tmp/cron_test.log

# 5. テスト用エントリを削除
[user01@linuc-node01 ~]$ crontab -r
[user01@linuc-node01 ~]$ rm -f /tmp/mycron.txt

6.3 演習2:LANG=Cによる英語メッセージ出力切り替えの検証

存在しないファイルをlsで指定した際、環境変数LANGの指定によって出力言語が切り替わる動作を検証します。

# 1. 通常の日本語ロケール環境で実行
[user01@linuc-node01 ~]$ ls /nonexistent_file_test
ls: '/nonexistent_file_test' にアクセスできません: そのようなファイルやディレクトリはありません

# 2. LANG=C を先頭に付与して実行
[user01@linuc-node01 ~]$ LANG=C ls /nonexistent_file_test
ls: cannot access '/nonexistent_file_test': No such file or directory

英語メッセージを取得できるため、エラー解析の検索効率が向上します。

6.4 演習3:iconvを用いたUTF-8とShift_JIS間の相互変換

テスト用テキストを作成し、Shift_JISへの変換とUTF-8への復元を検証します。

# 1. UTF-8テキスト作成
[user01@linuc-node01 ~]$ echo "LinuC Level 1 学習検証" > /tmp/utf8.txt

# 2. Shift_JISへ変換
[user01@linuc-node01 ~]$ iconv -f UTF-8 -t SHIFT-JIS -o /tmp/sjis.txt /tmp/utf8.txt

# 3. ファイルタイプの確認
[user01@linuc-node01 ~]$ file /tmp/sjis.txt
/tmp/sjis.txt: Non-ISO extended-ASCII text, with CRLF, LF line terminators

# 4. クリーンアップ
[user01@linuc-node01 ~]$ rm -f /tmp/utf8.txt /tmp/sjis.txt

7. LinuC 102試験対策まとめとコマ問頻出チェック

主題1.08.2および1.08.3(重要度合計7)から、コマ問頻出の重要ポイントを整理します。

7.1 cron日時フィールド・ロケール変数完全対比表

フィールド / 変数 設定項目・範囲 試験での着眼点
第1列: 分 0 〜 59 */10 は10分ごと
第2列: 時 0 〜 23 0 は午前0時(深夜24時)
第3列: 日 1 〜 31 1 は毎月1日
第4列: 月 1 〜 12 jan, feb... も可
第5列: 曜日 0 〜 7 0と7は共に日曜日、1は月曜日
第6列(/etc/crontabのみ) 実行ユーザー名 ユーザーcrontabには存在しない
LC_ALL 全設定の上書き 最優先変数(すべてを凌駕)
LANG 既定の基本ロケール 個別指定がない場合のフォールバック

7.2 コマ問(記述式)頻出キーワード一覧表

以下の設問に対するコマンド名、オプション、または設定値を想起してください。

  • 問題1: ユーザーのcrontabにおいて、曜日フィールドで「日曜日」を表す数値は何か?(2つ)
  • 問題2: システムcrontab(/etc/crontab)において、曜日フィールドと実行コマンドの間に記述すべき項目は何か?
  • 問題3: 待機中のatジョブ一覧とジョブ番号を表示するコマンドは何か?
  • 問題4: ロケール関連の環境変数のうち、他の全LC_*設定を無条件で上書きする最優先変数は何か?
  • 問題5: テキストファイルの文字コードを変換する標準コマンドは何か?
  • 問題6: テキストファイルの文字コード変換において、変換元の文字コードを指定するiconvのオプションは何か?
  • 問題7: 不定期に稼働するPC等において、マシンの電源OFF中に実行されなかった定期ジョブを起動後に遅延実行する仕組みは何か?
解答と解説を見る
設問 正解(記述内容) 補足・別解
問題1 0 および 7 英語名 sun も可
問題2 実行ユーザー名(ユーザーアカウント名) root など
問題3 atq(または at -l 削除は atrm
問題4 LC_ALL 最上位の優先度
問題5 iconv GNU iconv
問題6 -f(または --from-code 変換先は -t
問題7 anacron 設定は /etc/anacrontab

7.3 Ping-t演習へのブリッジ(対象分野と推奨学習順)

LinuC 102試験における「ジョブスケジューリング」と「ローカリゼーション」は、短期間の暗記で得点を積み増せる高コストパフォーマンス分野です。

  • 主題1.08:管理業務
    • 「システム管理タスクの自動化とスケジュール設定」分野(重要度4):cronの5列指定問題、cron.allow/cron.denyの判定ルール、anacrontabの書式、atq/atrmの記述問題をコンボ演習します。
    • 「ローカリゼーションと国際化」分野(重要度3):LC_ALL > LC_* > LANGの優先関係、iconv -f -t -oのオプション指定、timedatectlの操作を完璧にします。

8. まとめと次回予告

  • ユーザーcrontabは5列(分・時・日・月・曜日)、/etc/crontabは第6列にユーザー名が入る6列構成です
  • 曜日指定では 07 の双方が日曜日を指し、ステップ値は */15 のように記述します
  • 電源OFF期間のジョブを起動後に実行する機構が anacron であり、1回限り実行は at を用います
  • ロケール変数は LC_ALL が最優先され、フォールバックとして LANG が機能します
  • 文字コード変換には iconv -f <from> -t <to> を用います

次回はLinuC 102試験のネットワーク基盤となる主題1.07「ネットワークの基礎」より、TCP/IPプロトコルスタック、IPv4/IPv6アドレス、サブネットマスク計算、CIDR表記、主要ポート番号(22, 53, 80, 443等)、およびプライベートIPアドレスの範囲を詳しく解説します。

前の記事
次の記事