「深夜0時にBasic認証を解除して」にどう対応しますか?
Webサイトの制作や運営をしていると、「サイト公開日の深夜0時に、かかっているBasic認証を自動で外したい」といったご要望をいただくことがあります。
こんな時、多くの方がまず cron(クロン) を思い浮かべるかもしれません。もちろん cron でも対応可能ですが、cron は基本的に「繰り返し実行する」ための仕組みです。そのため、指定時刻に実行された後、設定を削除(crontab -r など)する手間が発生します。
そこでおすすめしたいのが、at(アット)コマンドです。at コマンドは「1回だけ」コマンドを実行したい場合に非常に便利で、実行後に設定が自動的に削除されます。
この記事では、at コマンドの使い方と、cron との違いについて詳しく解説します。
大前提:サーバー時刻の確認
タスクの予約実行を行う前に、大前提としてサーバーのシステム時刻が合っているかを確認しましょう。いくら正確に予約しても、肝心の時計がずれていては意味がありません。
以下の date コマンドで現在の時刻を確認できます。
[vagrant@local ~]$ date 2023年 11月 2日 木曜日 18:20:18 JST
(筆者も過去に、サーバー時刻が1日以上ずれていた現場に遭遇したことがあります…!)
atコマンドの使い方:1回きりのタスクを実行する
at コマンドは、指定した時刻に一度だけコマンドやスクリプトを実行するためのコマンドです。cron との最大の違いは「繰り返さない」点にあります。
1. at のインストールとサービス起動
環境によっては at がインストールされていない場合があります。まずはインストールと、常駐プロセスである atd(at daemon)を起動します。(CentOS/RHEL系の例)
# at をインストール sudo yum install at # atd サービスを起動 sudo service atd start # OS起動時に自動起動するように設定(推奨) sudo systemctl enable atd
atd が起動していないと「Can’t open /var/run/atd.pid…」といったエラーが出ることがあるので、必ず確認しましょう。
2. at コマンドでタスクを予約する
at コマンドの基本的な設定手順は以下の通りです。
a) at [時刻] [日付] を入力し、Enter を押します。
時刻や日付の指定方法は非常に柔軟ですが、ここでは記事の例に合わせて「HH:ii mmddYYYY」形式で指定します。
# 例:2023年11月2日の17:27に設定 at 17:27 11022023
b) at> の後に「実行したいコマンド」を入力し、Enter を押します。
今回は「.htaccess を削除し、htaccessOrg(Basic認証が解除されたファイル)を .htaccess にリネームする」コマンドを実行します。
at> rm -f .htaccess; mv htaccessOrg .htaccess
c) at> の状態で Ctrl + D を押して、入力を完了します。
これでジョブが登録されます。
3. 予約したタスク(ジョブ)の確認
正しく設定されたかを確認するには atq コマンドを使います。
[vagrant@local ~]$ atq 1 Thu Nov 2 17:27:00 2023 a vagrant
上記のようにジョブ番号、実行日時、ユーザーが表示されれば設定完了です。指定時刻になるとコマンドが実行され、このジョブは自動的に削除されます。
(補足)古い.htaccessを残す場合
もし古い .htaccess ファイル(Basic認証がかかっているファイル)をバックアップとして残したい場合は、以下のようにリネームするコマンドを実行すると良いでしょう。
at> mv .htaccess htaccessOld; mv htaccessOrg .htaccess
比較:cronコマンドで実行する場合
比較対象として、同じタスクを cron で実行する場合の方法も見てみましょう。cron は「定期的に」タスクを実行するための仕組みです。
cron の基本操作
- 設定ファイルを開く (編集):
crontab -e - 設定内容を表示:
crontab -l - 設定をすべて削除:
crontab -r(※実行には十分注意してください)
cron の書式
cron は「分 時 日 月 曜日 (実行コマンド)」の順で記述します。
| 位置 | 意味 | 指定範囲 | 備考 |
|---|---|---|---|
| 1番目 | 分 | 0-59 | |
| 2番目 | 時 | 0-23 | |
| 3番目 | 日 | 1-31 | |
| 4番目 | 月 | 1-12 | |
| 5番目 | 曜日 | 0-7 | 0と7は日曜日 |
(* は「すべての値」を意味します)
1回きりのタスクを cron で行う場合
今回の「11月2日 18:00に実行」というタスクを cron で設定する場合、crontab -e でエディタ(通常は vi など)を開き、以下のように記述します。
# 11月2日 18:00にBasic認証解除を実行 0 18 2 11 * mv .htaccess htaccessOld; mv htaccessOrg .htaccess
ファイルを保存(vi なら :wq)すれば設定完了です。
ただし、cron は設定を削除しない限り、翌年以降も毎年11月2日の18時にこのコマンドを実行し続けてしまいます。
そのため、実行が確認された後に crontab -e で該当行を削除するか、crontab -r で設定全体を削除する作業が必要になります。
この「後処理」が不要な点が、at コマンドの大きなメリットです。
まとめ:at と cron の使い分け
Webサイト運営におけるタスクの自動化には、at と cron が非常に役立ちます。
atコマンド: 「1回だけ」実行したい場合に最適。(例:サイト公開日のBasic認証解除、特定のデータ移行処理)cronコマンド: 「定期的・繰り返し」実行したい場合に最適。(例:毎晩のバックアップ、毎週のログ集計)
目的に合わせて適切なコマンドを選び、作業の自動化・効率化に役立ててください。
よくある質問(FAQ)
Q1: at と cron は、具体的にどう使い分ければ良いですか?
A1: 最も大きな違いは「繰り返すか、1回きりか」です。
at は、「来週月曜の朝9時に、この処理を1回だけ実行したい」といった単発のタスクに使います。
cron は、「毎日深夜3時にバックアップを取りたい」「毎週日曜日にログを整理したい」といった定期的なメンテナンス作業に使います。
Q2: at で予約したジョブ(タスク)を、実行前に削除したい場合はどうすればいいですか?
A2: atrm コマンドを使用します。
まず atq コマンドで削除したいジョブの「ジョブ番号」を確認します。
[vagrant@local ~]$ atq 1 Thu Nov 2 17:27:00 2023 a vagrant
次に、atrm [ジョブ番号] を実行します。
# ジョブ番号「1」を削除 atrm 1
これで予約がキャンセルされます。
Q3: at コマンドを実行しようとすると「at: command not found」や「Can’t open /var/run/atd.pid」とエラーが出ます。
A3: 2つの可能性が考えられます。
1. at: command not found の場合:
at パッケージがインストールされていません。sudo yum install at(CentOS/RHEL系)や sudo apt install at(Debian/Ubuntu系)でインストールしてください。
2. Can't open /var/run/atd.pid の場合:
at の実行に必要なデーモン(サービス)である atd が起動していません。sudo service atd start または sudo systemctl start atd でサービスを起動してください。あわせて、sudo systemctl enable atd でOS起動時に自動起動するように設定しておくと便利です。