こんにちは、インフラエンジニアのryuです。
今回は、LPIC-1の102試験で出題される、cronとatによるジョブのスケジュールを練習問題で確かめていきます。
cronは、決まった時間にコマンドを自動で動かす仕組みです。実務でもバックアップやログの整理などで毎日のように使われています。
ただ、試験では 30 2 * * 1 のような書式を見て、いつ動くかを答える問題がよく出ます。欄の順番を1つ取り違えるだけで答えが変わるので、なんとなく覚えていると失点しやすい分野です。
この記事では、出題範囲を確認したあと、crontabの欄の読み方、使えるユーザーの制限、at、systemdタイマーの順に整理し、最後に練習問題8問を解いてもらいます。
LPIC-1のcronはどこで出題される?¶
最初に、出題範囲を確認しておきましょう。
cronとatは、102試験(102-500)の主題107「管理タスク」の中にある、107.2「ジョブのスケジューリングによるシステム管理タスクの自動化」で出題されます。重みは4です。
LPIの公式の学習教材では、この項目で求められる知識として次の4つが挙げられています。
| 求められる知識 | 主なコマンド・ファイル |
|---|---|
| cronとatのジョブを管理する | crontab /etc/crontab /etc/cron.d/ at atq atrm |
| cronとatを使えるユーザーを設定する | /etc/cron.allow /etc/cron.deny /etc/at.allow /etc/at.deny |
| systemdのタイマーユニットを理解する | .timer ファイル、systemctl list-timers |
systemd-run を使う |
一時的なタイマーを作って、あとでコマンドを動かす |
cronは「くり返し動かす」、atは「1回だけ動かす」と分けて覚えておくと、問題文を読んだときにどちらの話かすぐ判断できます。
crontabの基本的な設定手順は、crontabの設定方法の記事で詳しく解説しています。この記事では、試験で問われる読み方と区別に絞って進めます。
crontabの5つの欄の読み方¶
cronの問題は、ほとんどがこの書式の読み方から始まります。
ユーザーのcrontabの1行は、時間を表す5つの欄と、実行するコマンドでできています。
# 分 時 日 月 曜日 コマンド
30 2 * * 1 /usr/local/bin/backup.sh
この例は、毎週月曜日の2時30分に backup.sh を動かす、という意味です。左から順に、次のように読みます。
| 欄 | 意味 | 書ける値 |
|---|---|---|
| 1番目 | 分 | 0〜59 |
| 2番目 | 時 | 0〜23 |
| 3番目 | 日 | 1〜31 |
| 4番目 | 月 | 1〜12(jan などの英語の略称も可) |
| 5番目 | 曜日 | 0〜7(0 と 7 が日曜日。mon などの略称も可) |
いちばん多い間違いは、1番目を「時」と読んでしまうことです。cronの欄は「分・時・日・月・曜日」の順で、小さい単位から並んでいると覚えておきましょう。
記号の意味(* と , と - と /)¶
欄には、数字だけでなく記号も使えます。試験に出るのは次の4つです。
| 記号 | 意味 | 例 | 例の読み方 |
|---|---|---|---|
* |
すべての値 | 時の欄が * |
毎時 |
, |
値を並べる | 分の欄が 0,30 |
0分と30分 |
- |
範囲 | 曜日の欄が 1-5 |
月曜日から金曜日 |
/ |
間隔 | 分の欄が */15 |
15分ごと |
組み合わせると、たとえば 0 9-17 * * 1-5 は「平日の9時から17時まで、毎時0分」という意味になります。
1つだけ注意したいのが、日の欄と曜日の欄の両方に値を書いたときです。crontabのマニュアルでは、両方が指定されていると、どちらか一方に合えば動くと説明されています。0 0 1 * 1 は「毎月1日で、しかも月曜日」ではなく、「毎月1日」と「毎週月曜日」の両方で動きます。
/etc/crontabとユーザーのcrontabの違い¶
cronの設定ファイルは1つではありません。試験では、どこに書くかで書式が変わる点がよく問われます。
| 場所 | 編集のしかた | 書式 |
|---|---|---|
| ユーザーのcrontab | crontab -e で編集する |
5つの欄 + コマンド |
/etc/crontab |
rootがエディタで直接編集する | 5つの欄 + 実行するユーザー名 + コマンド |
/etc/cron.d/ の中のファイル |
rootがファイルを置く | /etc/crontab と同じ(ユーザー名の欄がある) |
/etc/cron.daily/ など |
スクリプトを置くだけ | 書式はなく、置いたスクリプトが毎日(毎週・毎月)動く |
システム全体の設定ファイルには、6番目にユーザー名の欄が入ります。ユーザーのcrontabにユーザー名を書くと、それがコマンドの一部として扱われてしまうので注意してください。
ユーザーのcrontabの中身は /var/spool/cron/ の下に保存されますが、このファイルを直接編集せず、crontab コマンドを使うのが決まりです。よく使うオプションは次のとおりです。
crontab -e # 自分のcrontabを編集する
crontab -l # 自分のcrontabの内容を表示する
crontab -r # 自分のcrontabを削除する(確認なしで全部消えるので注意)
crontab -u alice -l # rootがaliceのcrontabを表示する
-e と -r はキーボードで隣どうしにあるので、打ち間違えると登録したジョブがすべて消えます。試験でも実務でも、-r の意味ははっきり覚えておきましょう。
cronとatを使えるユーザーを制限する¶
次は、cronやatを使えるユーザーを決めるファイルです。
/etc/cron.allow と /etc/cron.deny の関係は、次の表のように決まっています。
| ファイルの状態 | crontabを使えるユーザー |
|---|---|
cron.allow がある |
cron.allow に書かれたユーザーだけ(cron.deny は見ない) |
cron.allow がなく、cron.deny がある |
cron.deny に書かれていないユーザー全員 |
| どちらもない | 実装や設定によって異なる(rootだけ、または全員) |
ポイントは、allow が deny より優先されることです。cron.allow があれば、そこに名前がないユーザーは、cron.deny に書かれていなくても使えません。
atも同じように /etc/at.allow と /etc/at.deny で制限します。at.allow・at.denyのマニュアルでは、どちらのファイルもないときはroot(スーパーユーザー)だけが使える、空の at.deny があるときは全員が使える、と説明されています。
atで1回だけ動かす¶
atは、指定した時刻に1回だけコマンドを動かす仕組みです。cronと違って、実行したら終わりです。
at 23:00 # 23時に動かすコマンドを入力する(Ctrl+Dで確定)
at now + 10 minutes # 今から10分後
atq # 予約しているジョブの一覧(at -l と同じ)
atrm 3 # ジョブ番号3を取り消す(at -d 3 と同じ)
at を実行すると、動かしたいコマンドを入力する画面になります。入力が終わったら Ctrl+D で確定します。
atのジョブを動かしているのは atd というデーモンです。ディストリビューションによっては最初から入っていないので、使えないときはパッケージが入っているか、atd が動いているかを確認してください。
似た名前のコマンドに
batchがあります。時刻を指定するのではなく、システムの負荷が下がったときにコマンドを動かします。
systemdのタイマーとsystemd-run¶
5.0の出題範囲には、cronの代わりに使えるsystemdのタイマーも含まれています。
タイマーは、.timer という拡張子のユニットファイルで定義します。同じ名前の .service ユニットを、決まった時刻やきっかけで起動する仕組みです。
systemctl list-timers # 登録されているタイマーと、次に動く時刻の一覧
systemctl list-timers --all # 止まっているタイマーも含めて表示する
# 一時的なタイマーを作り、30分後にコマンドを1回動かす
sudo systemd-run --on-active=30m /usr/local/bin/cleanup.sh
systemd-run は、ユニットファイルを書かずに、その場で一時的なサービスやタイマーを作るコマンドです。--on-active= で「今から何分後」を指定できるので、atに近い使い方ができます。
cronとsystemdタイマーのどちらを選ぶかという実務の話は、cronとsystemd timerの違いの記事で詳しく比べています。systemdのユニットやターゲットの基本があいまいな人は、systemdの練習問題も先に解いておくと、タイマーの話が理解しやすくなります。
今日やる練習:1分ごとに動くジョブを作って、消す¶
ここで一度、手を動かしてみましょう。練習用のLinuxで、次の順に打ってみてください。
# 1. 今のcrontabを確認する(何も登録していなければ、登録がないという表示になる)
crontab -l
# 2. crontab -e を開き、次の1行を書いて保存する
# * * * * * date >> /tmp/cron-test.log
# 3. 2〜3分待ってから、ログに時刻が増えているか確認する
cat /tmp/cron-test.log
# 4. 確認できたら、crontab -e でさっきの行を消して保存する
crontab -l
1分ごとに時刻が1行ずつ増えていれば成功です。増えないときは、cronのデーモン(ディストリビューションによって cron または crond)が動いているかを systemctl status で確認してみてください。
最後に、登録した行を消すのを忘れないようにしましょう。ここで crontab -r を使うと、ほかに登録しているジョブもすべて消えてしまいます。
LPIC-1のcron・atの練習問題8問¶
ここまでの内容を、練習問題で確かめてみましょう。正解と解説は、各問題の下の引用にまとめています。
問題1:crontabの書式を読む¶
ユーザーのcrontabに次の行があります。このジョブが動くのはいつですか。
30 2 * * 1 /usr/local/bin/backup.sh
- A. 毎日2時30分
- B. 毎週月曜日の2時30分
- C. 毎月1日の2時30分
- D. 毎週火曜日の30時2分
正解:B 欄は左から「分・時・日・月・曜日」です。分が30、時が2、曜日が1(月曜日)なので、毎週月曜日の2時30分です。毎月1日にするには3番目の日の欄に1を書きます。
問題2:平日の日中に動かす¶
平日(月曜日から金曜日)の9時から17時まで、毎時0分にコマンドを動かしたいとき、時間の欄の書き方として正しいものはどれですか。
- A.
0 9-17 1-5 * * - B.
9-17 0 * * 1-5 - C.
0 9-17 * * 1-5 - D.
* 9-17 * * 1-5
正解:C 分が0、時が9から17、曜日が1から5です。Aは3番目の「日」に1-5を書いているので、毎月1日から5日の意味になります。Bは分と時が逆です。Dは分が
*なので、9時台から17時台まで毎分動いてしまいます。
問題3:間隔の指定¶
分の欄に */15 と書いたときの意味として正しいものはどれですか。
- A. 15分に1回だけ動く
- B. 15分ごとに動く(0分・15分・30分・45分)
- C. 毎時15分に動く
- D. 15時に動く
正解:B
/は間隔を表します。*/15は、0〜59の範囲を15分ごとに区切るという意味です。毎時15分に1回だけ動かしたい場合は、分の欄に15と書きます。
問題4:ユーザー名の欄がある設定ファイル¶
時間の5つの欄とコマンドの間に、実行するユーザー名を書く必要があるファイルはどれですか。
- A.
crontab -eで編集するユーザーのcrontab - B.
/etc/crontab - C.
/etc/cron.allow - D.
/etc/cron.daily/に置いたスクリプト
正解:B
/etc/crontab(と/etc/cron.d/のファイル)はシステム全体の設定なので、6番目にユーザー名の欄があります。ユーザーのcrontabは、そのユーザーとして動くのでユーザー名の欄はありません。/etc/cron.daily/にはスクリプトを置くだけで、書式はありません。
問題5:crontabの内容を表示する¶
自分のcrontabに登録されている内容を、変更せずに表示するコマンドはどれですか。
- A.
crontab -e - B.
crontab -r - C.
crontab -l - D.
crontab -d
正解:C
-lは表示、-eは編集、-rは削除です。-rは確認なしで自分のcrontabをすべて消すので、-eとの打ち間違いに注意します。
問題6:cron.allowとcron.denyの優先順位¶
/etc/cron.allow には alice だけが書かれています。/etc/cron.deny には bob が書かれています。一般ユーザーの alice・bob・carol のうち、crontab コマンドを使えるのは誰ですか。
- A.
aliceだけ - B.
aliceとcarol - C.
carolだけ - D. 3人とも使える
正解:A
cron.allowがあるときは、そこに書かれたユーザーだけが使えます。このときcron.denyは見られないので、carolもcron.denyに書かれていないのに使えません。
問題7:atのジョブを取り消す¶
atq で確認したところ、取り消したいジョブの番号は3でした。このジョブを取り消すコマンドはどれですか。
- A.
atq -r 3 - B.
atrm 3 - C.
at -l 3 - D.
crontab -r 3
正解:B atのジョブは
atrmにジョブ番号を指定して取り消します(at -dでも同じ)。at -lはatqと同じで、一覧を表示するだけです。
問題8:systemdのタイマーを確認する¶
systemdに登録されているタイマーと、それぞれが次に動く予定の時刻を一覧で確認するコマンドはどれですか。
- A.
systemctl list-timers - B.
systemctl list-jobs - C.
systemd-run --list - D.
atq
正解:A
systemctl list-timersは、タイマーユニットと次に動く時刻、前回動いた時刻を表示します。systemctl list-jobsは、いま実行中・待機中のsystemdのジョブ(起動や停止の処理)を表示するもので、タイマーの一覧ではありません。
8問のうち、何問正解できたでしょうか。間違えた問題は、その問題の書式を自分のcrontabに書いてみると、欄の順番が手で覚えられます。
InfraAcademyで、cronの練習を続ける¶
InfraAcademyでは、ブラウザ上で動くLinuxの練習環境で、コマンドを自分のPCを用意せずに試せます。crontab -l やファイルの確認など、今日の練習の前後にある基本操作をくり返すのに使ってみてください。
問題演習は、トップページのInfraAcademy の資格模擬問題から「(無料)LPICの練習問題で毎日トレーニング300問」を解いてみてください。cronの問題で迷ったら、書式を紙に書き出して「分・時・日・月・曜日」と1つずつ当てはめるくせをつけると、読み違いが減ります。
102試験のほかの範囲も練習問題で確かめたい人は、LPIC-1のプロセス管理の練習問題もあわせて解いてみてください。学ぶ順番はLinuxの学習ロードマップ、LPICの勉強全体の進め方はLPICの勉強方法にまとめています。
まとめ¶
今回は、LPIC-1の102試験で出題されるcron・at・systemdタイマーを、練習問題8問で確かめました。
- crontabの欄は「分・時・日・月・曜日」の順で、小さい単位から並ぶ
- 記号は
*(すべて)、,(並べる)、-(範囲)、/(間隔)の4つ /etc/crontabと/etc/cron.d/には、ユーザー名の欄が入るcron.allowがあれば、そこに書かれたユーザーだけが使える- 1回だけ動かすならat。一覧は
atq、取り消しはatrm - systemdのタイマーは
systemctl list-timersで確認し、systemd-runで一時的に作れる
cronの書式は、読むだけより自分で1行書いて動かしたほうがずっと早く覚えられます。今日の練習で作ったジョブを消し忘れていないかだけ確認して、次の範囲に進んでいきましょう。
参考¶
- LPIC-1 Exam 102 Objectives(Linux Professional Institute)
- 107.2 Automate system administration tasks by scheduling jobs(LPI Learning Materials)
- crontab(5) — Linux manual page(man7.org)
- at.allow(5), at.deny(5)(Debian Manpages)
- systemd-run(1) — Linux manual page(man7.org)
- systemd.timer(5) — Linux manual page(man7.org)



