Linuxなどで定期的に特定のプログラムを実行したい場合、外部のジョブシステム(JP1だったりRundeckだったり)やcronで処理をすることが多いだろう。 だが、特定の日時に1度だけ実行したい、という場合は、atコマンドという日時を指定して、一度だけプログラムを実行させるコマンドを利用する場合が多い。今回は、そのatコマンドを使う上で覚えておきたい使い方をまとめてみる。

なお、ここではatと同じパッケージに含まれるatq、atrm、batchコマンドについても触れる。

1. 基本的な使い方

最初にも記述したことではあるが、atコマンドは指定した時間にジョブを実行するためのコマンドだ。cronは曜日や月、日を指定して繰り返し実行させるためのプログラムだが、このatコマンドは指定日時に一度だけジョブが実行される。 以下のような書き方で指定時刻を指定する。時刻指定後は対話型インターフェイスに入るので、そこで実行する内容について記述する(対話型インターフェイスはCrtl+Dで終了)。

at 時刻

指定できる時刻指定フォーマットは以下のような形式だ。 日本人にはちょっと馴染みのない形式ばっかりなのでちょっと戸惑う…(YYYY/MM/DDあたりもあればいいのに)。

  • HH:MM # 当日の時刻
  • HH:MM YYYY-mm-dd
  • HH:MM mmddYYYY
  • HH:MM mm/dd/YYYY
  • HH:MM mm.dd.YYYY

その他、明日のX時とか、あとN時間後などの相対時間指定もできる。 以下、一部抜粋。

  • now + 10minutes # 10分後
  • 12:00 + 3days # 3日後の12:00
  • tomorrow # 明日の同じ時間
  • teatime # 次の16:00
  • noon # 次の12:00(お昼)
  • midnight # 次の24:00

また、-tオプションを使用することで、YYYYMMDDhhmmssというフォーマットで時刻の指定ができる。 以下の例では、2020年01月02日 03時04分を指定している。

at -t 202001020304

2. ジョブを確認する

現在登録されているジョブの一覧を確認する場合は、以下のコマンドを実行する。

at -l
atq

ジョブの内容について確認する場合は、以下のようにジョブ番号を指定する。

at -c <ジョブ番号>

3. ジョブを削除する

ジョブを削除する場合は、以下のようにジョブ番号を指定してコマンドを実行する。

at -r <ジョブ番号>
at -d <ジョブ番号>
atrm <ジョブ番号>

4. 時刻ではなく、負荷レベルで実行タイミングを指定する

以下のようにコマンド実行すれば、ジョブの実行タイミングを時刻ではなく、システム負荷が低いタイミングに処理させるよう指定することもできる。

at -b
batch

5. 利用できるユーザを制限する

atコマンドは、/etc/at.arrowというファイルに記載されているユーザのみ実行可能にしたり、/etc/at.denyというファイルに記載されているユーザは実行できないようにする、といった制限もできる。 (といっても、あまり使わなそうな気もするが…)

6. ジョブで実行する内容をファイルで指定する

ジョブで実行させる内容を、ファイルで指定する場合は-fオプションを付与する。

at HH:MM YYYY-mm-dd -f /path/to/file

また、プロセス置換を利用することでコマンドから直接実行内容を指定できる。

at HH:MM YYYY-mm-dd -f <(echo command...)