107.2 レッスン 2
Certificate: |
LPIC-1 |
---|---|
Version: |
5.0 |
Topic: |
107 管理タスク |
Objective: |
107.2 ジョブをスケジュールしてシステム管理タスクを自動化する |
Lesson: |
2 of 2 |
はじめに
前のレッスンで学習したように、cronやsystemdタイマーを使用して(定期的な)ジョブをスケジュールできますが、1回だけジョブを実行する必要があるかもしれしれません。これを行うには、別の強力なユーティリティである at
コマンドを使用します。
at
でジョブをスケジュールする
at
コマンドは、ジョブを1回だけ実行する時間を指定して使用します。コマンドラインで at
コマンドと実行するタイミングを入力すると at
プロンプトが表示されますから、実行するコマンドを入力します。 Ctrl+Dキーを入力するとプロンプトが終了します。
$ at now +5 minutes warning: commands will be executed using /bin/sh at> date at> Ctrl+D job 12 at Sat Sep 14 09:15:00 2019
上の例の at
ジョブは、5分後に date
コマンドを実行するだけです。cron
と同様に、標準出力とエラー出力は電子メールで送信されます。at
ジョブをスケジュールするには、atd
デーモンが実行されている必要があります。
Note
|
Linuxには、 |
at
コマンドの重要なオプションを以下に示します:
-c
-
指定したジョブIDのコマンドを標準出力に表示します。
-d
-
指定したIDを持つジョブを削除します。
atrm
のエイリアスです。 -f
-
標準入力ではなく、指定したファイルからジョブを読み込みます。
-l
-
自分の実行待ちのジョブを一覧表示します。rootの場合は、すべてのユーザーのすべてのジョブを一覧表示します。これは
atq
のエイリアスです。 -m
-
ジョブに出力がなかった場合にも、終了時にユーザーにメールを送信します。
-q
-
ジョブを投入するキューを、
a
〜z
とA
〜Z
の1文字で指定します(デフォルトでは、at
の場合はa
、batch
の場合はb
)。高位のキュー内のジョブは、より大きなナイス値を持って実行されます。大文字のキューに送られたジョブは、batch
ジョブとして扱われます。 -v
-
ジョブの前に、ジョブが実行されるタイミング(時刻)を表示します。
atq
でスケジュールされたジョブを一覧表示する
では、2つの at
ジョブをスケジュールしてみましょう: 1つ目は午前9時30分に foo.sh
スクリプトを実行し、2つ目は1時間後に bar.sh
スクリプトを実行します。
$ at 09:30 AM warning: commands will be executed using /bin/sh at> ./foo.sh at> Ctrl+D job 13 at Sat Sep 14 09:30:00 2019 $ at now +2 hours warning: commands will be executed using /bin/sh at> ./bar.sh at> Ctrl+D job 14 at Sat Sep 14 11:10:00 2019
実行待ちのジョブを一覧表示するには、atq
コマンドを使用します。ジョブごとに次の情報が表示されます: ジョブID、実行される日付と時刻、キュー、ユーザー名。
$ atq 14 Sat Sep 14 11:10:00 2019 a frank 13 Sat Sep 14 09:30:00 2019 a frank 12 Sat Sep 14 09:15:00 2019 a frank
at -l
コマンドは atq
のエイリアスです。
Note
|
rootとして |
atrm
でジョブを削除する
at
ジョブを削除する場合は、atrm
コマンドに続けてジョブIDを指定します。たとえば、ID 14のジョブを削除するには、次のコマンドを実行します:
$ atrm 14
atrm
に、空白で区切って複数のIDを指定すると、複数のジョブを削除できます。at -d
コマンドは atrm
のエイリアスです。
Note
|
rootとして |
ジョブスケジューリングへのアクセスを制限する
/etc/at.allow
ファイルと /etc/at.deny
ファイルを使用して、ユーザーごとに at
ジョブの利用を制限することができます。/etc/at.allow
が存在する場合、その中にリストされているユーザーとrootのみが at
ジョブをスケジュールできます。/etc/at.allow
は存在しないが、/etc/at.deny
が存在する場合、その中にリストされている一般ユーザーは、at
ジョブをスケジュールできません(空の /etc/at.deny
ファイルは、すべての一般ユーザーが at
ジョブをスケジュールできることを意味します)。どちらのファイルも存在しない場合の挙動は、ディストリビューションによって異なります。
実行時刻の指定方法
at
ジョブの実行時刻は、HH:MM
の形式で指定します。12時間表記の場合は、AMまたはPMを続けます。指定の時刻を過ぎている場合は、翌日と見なされます。ジョブが実行される日付を指定したい場合は、時刻の後に次のいずれかの形式で日付を指定します: 月 日付
、月 日付 年
、MMDDYY
、MM/DD/YY
、DD.MM.YY
、YYYY-MM-DD
(訳注: 月は英単語かその3文字省略形で指定します)。
あるいは次のようなキーワードも使用できます: midnight
(0時)、noon
(12時)、teatime
(4 pm)、now
。これらのキーワードにプラス記号(+
)と数字、時間単位(minutes、hours、days、weeks)を続けられます。最後に、today
ないし tomorrow
という単語を置いて、今日と明日のどちらに実行するかを指示できます。たとえば、at 07:15 AM Jan 01
は1月1日の07:15 amにジョブを実行し、at now +5 minutes
は5分後にジョブを実行します。時刻表記方法の正確な定義は、/usr/share/doc/at
にある timespec
ファイルにあります。
at
の代替
サービスマネージャとしてsystemdを採用しているマシンでは、systemd-run
コマンドを使用して1回限りのタスクをスケジュールすることができます。このコマンドは通常、サービスファイルを作成することなく、指定した時刻にコマンドを実行する一時的なタイマーユニットを作成するために使用します。例えば、rootとして次のコマンドを実行すれば、2019年10月6日午前11時30分に date
コマンドを実行させられます。
# systemd-run --on-calendar='2019-10-06 11:30' date
2分後に現在の作業ディレクトリにある foo.sh
スクリプトを実行するには、以下のようにします。
# systemd-run --on-active="2m" ./foo.sh
systemd-run
の機能については、systemd-run(1)
のマニュアルページを参照してください。
Note
|
タイマーはsystemdジャーナルに記録されるので、さまざまなユニットのログを |
演習
-
at
に対する時間指定として、有効なものはどれですか?at 08:30 AM next week
at midday
at 01-01-2020 07:30 PM
at 21:50 01.01.20
at now +4 days
at 10:15 PM 31/03/2021
at tomorrow 08:30 AM
-
at
でスケジュールしたジョブの、コマンドを確認するにはどうしますか? -
実行待ちの
at
ジョブを確認するコマンドは何ですか? また、それらを削除するコマンドは何ですか? -
systemdにおいて、
at
の代わりに使用するコマンドは何ですか?
発展演習
-
一般ユーザーとして、10月31日の午前10時30分に、ホームディレクトリにある
foo.sh
スクリプトを実行するat
ジョブを作成してください。 -
別の一般ユーザーとしてシステムにログインし、明日の午前10時に
bar.sh
スクリプトを実行するat
ジョブを作成してください。スクリプトはそのユーザーのホームディレクトリにあるものとします。 -
さらに別の一般ユーザーとしてシステムにログインし、30分後に
foobar.sh
スクリプトを実行するat
ジョブを作成してください。スクリプトはそのユーザーのホームディレクトリにあるものとします。 -
次に、rootになって
atq
コマンドを実行して、ユーザーがスケジュールしたすべてのat
ジョブを確認してください。一般ユーザーとしてこのコマンドを実行するとどうなりますか? -
rootとして、1つのコマンドで、実行待ちの
at
ジョブすべてを削除して下さい。 -
ls -l /usr/bin/at コマンドを実行し、そのパーミッションを調べてください。
まとめ
このレッスンでは、以下の事柄を学びました。
-
at
を使用して、指定の時刻に1回限りのジョブを実行すること。 -
at
ジョブの管理。 -
at
ジョブスケジューリングへのユーザーアクセスを制限すること。 -
at
の代わりにsystemd-run
を使用すること。
このレッスンでは、以下に示すコマンドとファイルについて説明しました。
at
-
指定した時刻にコマンドを実行する。
atq
-
一般ユーザーの場合、そのユーザーの
at
ジョブを一覧表示する。rootの場合はすべてのユーザーのat
ジョブを表示する。 atrm
-
ジョブ番号を指定して
at
ジョブを削除する。 /etc/at.allow
および/etc/at.deny
-
at
の利用を制限する設定ファイル。 systemd-run
-
1回限り実行される
timer
ユニットを作成して開始する。
演習の解答
-
at
に対する時間指定として、有効なものはどれですか?at 08:30 AM next week
有効
at midday
無効
at 01-01-2020 07:30 PM
無効
at 21:50 01.01.20
有効
at now +4 days
有効
at 10:15 PM 31/03/2021
無効
at tomorrow 08:30 AM monotonic
無効
-
at
でスケジュールしたジョブの、コマンドを確認するにはどうしますか?at -c
コマンドの後に、コマンドを確認するジョブIDを指定します。出力には、ジョブがスケジュールされたときに有効だったほとんどの環境変数も含まれます。rootはすべてのユーザーのジョブを確認できることに注意してください。 -
実行待ちの
at
ジョブを確認するコマンドは何ですか? また、それらを削除するコマンドは何ですか?at -l
コマンドで実行待ちのジョブを確認し、at -d
コマンドでジョブを削除します。at -l
はatq
のエイリアスで、at -d
はatrm
のエイリアスです。rootは、すべてのユーザーのジョブを表示および削除できます。 -
systemdにおいて、at の代わりに使用するコマンドは何ですか?
at
の代わりにsystemd-run
コマンドを使用して、1回限りのジョブをスケジュールできます。たとえば、指定の時刻にコマンドを実行したり、任意の基準時点からの カレンダータイマー や モノトニックタイマー を定義したりできます。
発展演習の解答
-
一般ユーザーとして、10月31日の午前10時30分に、ホームディレクトリにある
foo.sh
スクリプトを実行するat
ジョブを作成してください。$ at 10:30 AM October 31 warning: commands will be executed using /bin/sh at> ./foo.sh at> Ctrl+D job 50 at Thu Oct 31 10:30:00 2019
-
別の一般ユーザーとしてシステムにログインし、明日の午前10時に
bar.sh
スクリプトを実行するat
ジョブを作成してください。スクリプトはそのユーザーのホームディレクトリにあるものとします。$ at 10:00 AM tomorrow warning: commands will be executed using /bin/sh at> ./bar.sh at> Ctrl+D job 51 at Sun Oct 6 10:00:00 2019
-
さらに別の一般ユーザーとしてシステムにログインし、30分後に
foobar.sh
スクリプトを実行するat
ジョブを作成してください。スクリプトはそのユーザーのホームディレクトリにあるものとします。$ at now +30 minutes warning: commands will be executed using /bin/sh at> ./foobar.sh at> Ctrl+D job 52 at Sat Oct 5 10:19:00 2019
-
次に、rootになって
atq
コマンドを実行して、ユーザーがスケジュールしたすべてのat
ジョブを確認してください。一般ユーザーとしてこのコマンドを実行するとどうなりますか?# atq 52 Sat Oct 5 10:19:00 2019 a dave 50 Thu Oct 31 10:30:00 2019 a frank 51 Sun Oct 6 10:00:00 2019 a emma
atq
コマンドをrootとして実行すると、すべてのユーザーのat
ジョブが一覧表示されます。一般ユーザーとして実行すると、そのユーザーのat
ジョブのみが一覧表示されます。 -
rootとして、1つのコマンドで、実行待ちの
at
ジョブすべてを削除して下さい。# atrm 50 51 52
-
ls -l /usr/bin/at コマンドを実行し、そのパーミッションを調べてください。
# ls -l /usr/bin/at -rwsr-sr-x 1 daemon daemon 43762 Dec 1 2015 /usr/bin/at
このディストリビューションでは、
at
コマンドにSUID(所有者の実行フラグが文字s
)とSGID(グループの実行フラグが文字s
)の両方が設定されているので、ファイルの所有者と所有グループの権限(両方ともdaemon
)で実行されます。このため、一般ユーザーでもat
でジョブをスケジュールできます。