Linuxでスケジューラを利用して1回のみジョブを実行する!(at)

スケジューラを利用して1回のみジョブを実行します。

スケジューラが起動していることを確認する!

スケジューラ(atd.service)が起動していることを確認します。

$ systemctl status atd.service
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2023-02-16 20:28:25 JST; 8h ago
 Main PID: 1214 (atd)
    Tasks: 1 (limit: 11263)
   Memory: 428.0K
   CGroup: /system.slice/atd.service
           └─1214 /usr/sbin/atd -f

時刻とコマンドを入力してジョブの実行を予約する!

時刻とコマンドを入力してジョブを予約します。時刻のみ指定すると次に訪れる指定した時刻にコマンドが実行されます。「at YY:MM」でatコマンドで時刻を指定して、「Enter」キーを押すと、コマンド入力モードになります。コマンド入力が終了したら、「Ctrl-d」を入力します。

$ at 10:00
warning: commands will be executed using /bin/sh
at> sleep 60
at> <EOT>
job 1 at Fri Feb 17 10:00:00 2023

実行するファイルを指定してジョブの実行を予約する!

at -fコマンドを使用すると、実行するファイルを指定してジョブの実行を予約できます。

$ at 11:00 -f /home/usradmin/sample_eval.sh
warning: commands will be executed using /bin/sh
job 2 at Fri Feb 17 11:00:00 2023

日時を指定してジョブの実行を予約する!

時刻だけでなく日時を指定してジョブの実行を予約します。デフォルトの日時の指定は、「HH:MM mm/dd/yyyy」のフォーマットでわかりくいです。

$ at 11:00 04012023 -f /home/usradmin/sample_eval.sh
warning: commands will be executed using /bin/sh
job 3 at Sat Apr  1 11:00:00 2023

「-t」オプションを指定すると、touchコマンドで使用するフォーマットで指定できます。

$ at -t 202304011100  -f /home/usradmin/sample_eval.sh
warning: commands will be executed using /bin/sh
job 4 at Sat Apr  1 11:00:00 2023

予約しているジョブを表示する!(atq/at -l)

予約しているジョブを表示します。

$ atq
1	Fri Feb 17 10:00:00 2023 a usradmin
2	Fri Feb 17 11:00:00 2023 a usradmin
3	Sat Apr  1 11:00:00 2023 a usradmin
4	Sat Apr  1 11:00:00 2023 a usradmin
$ at -l
1	Fri Feb 17 10:00:00 2023 a usradmin
2	Fri Feb 17 11:00:00 2023 a usradmin
3	Sat Apr  1 11:00:00 2023 a usradmin
4	Sat Apr  1 11:00:00 2023 a usradmin

予約しているジョブを削除する!(atrm/at -d)

予約しているジョブを削除します。

$ atrm 1
$ atq
2	Fri Feb 17 11:00:00 2023 a usradmin
3	Sat Apr  1 11:00:00 2023 a usradmin
4	Sat Apr  1 11:00:00 2023 a usradmin
$ at -d 2
$ atq
3	Sat Apr  1 11:00:00 2023 a usradmin
4	Sat Apr  1 11:00:00 2023 a usradmin

負荷が少ないタイミングでジョブを実行する!(batch/at -b)

ロードアベレージが少ないタイミングでジョブを実行するようにしていることができます。

$ batch
warning: commands will be executed using /bin/sh
at> sleep 10
at> <EOT>
job 5 at Fri Feb 17 06:11:00 2023
$ atq
3	Sat Apr  1 11:00:00 2023 a usradmin
4	Sat Apr  1 11:00:00 2023 a usradmin
5	Fri Feb 17 06:11:00 2023 = usradmin
$ atq
3	Sat Apr  1 11:00:00 2023 a usradmin
4	Sat Apr  1 11:00:00 2023 a usradmin
$ at -b
at> sleep 10
at> <EOT>
job 6 at Fri Feb 17 06:13:55 2023
$ atq
3	Sat Apr  1 11:00:00 2023 a usradmin
4	Sat Apr  1 11:00:00 2023 a usradmin
6	Fri Feb 17 06:13:00 2023 = usradmin
$ atq
3	Sat Apr  1 11:00:00 2023 a usradmin
4	Sat Apr  1 11:00:00 2023 a usradmin

即時にジョブを実行する!

時刻の指定にnowを指定すると、即時にジョブを実行します。

$ date
Fri Feb 17 06:17:31 JST 2023
$ at now  -f /home/usradmin/sample_eval.sh
warning: commands will be executed using /bin/sh
job 8 at Fri Feb 17 06:17:00 2023

atコマンドのセキュリティを設定する!

atコマンドについては、以下のファイルで使用できるユーザを制限することができます。

特定のユーザのみatコマンドを使用可能とする!

以下のファイルを作成して、ユーザを記述します。

/etc/at.allow

特定のユーザのみatコマンドを使用不可とする!

以下のファイルのみ作成して、ユーザを記述します。「/etc/at.allow」が存在すると、こちらのファイルは無効になります。

/etc/at.deny

おわりに

1度のみスケジュールを指定してジョブを実行したい場合は、atコマンドを使用すると便利です。

関連記事

関連書籍(Amazon)

N/A