Linuxでコマンドをスケジュールしてみよう (3) atコマンドスケジュールの確認

Linuxでコマンドをスケジュールしてみよう (3) atコマンドスケジュールの確認

2016.09.21

前回の「Linux でコマンドをスケジュールしてみよう(2) atコマンドでの実行内容の指定」では、at を使用したスケジュールの方法と、atq を使用したスケジュールの確認方法をご紹介しました。今回は at でスケジュールされた内容を詳細に確認する方法についてご紹介いたします。

at -c JobID コマンド

前回ご紹介したとおり、atq コマンドで、どの JobID が、いつ、どのユーザ権限で実行されるかを確認することができます。
ただし、どのようなコマンドが実行されるように指定されているのかは atq コマンドからはわかりませんでした。

どのようなコマンド実行されるようスケジュールされているか を確認するには下記の形式で実行します。

$ at -c JobID

実行すると、次の図のような結果が表示されます。
実行結果は1画面に収まらないため、先頭部分だけを表示しています。

$ at -c JobID 実行結果

実行結果の先頭部分は、どのような環境で実行するか、環境設定(変数設定)のためのコマンド行が表示されます。
ユーザが at コマンドでスケジュールした際、その時点のユーザ環境でスケジュールしたコマンド行が実行されるように、環境ごと保存されます。
このように at コマンド は、スケジュールしたときの環境ごと保存して実行 しますので、後日ユーザの環境が変わってしまっても、その影響を受けません。
そのスケジュールしたときの環境で後日、指定したコマンドを実行することができます。

それらが表示されたあと、末尾あたりにユーザが実行するよう指定したコマンドが表示されます。
次の図に先ほどの結果の続き、末尾を表示します。

$ at -c JobID 実行結果(続き、末尾)

この末尾を見て、どのコマンドを実行するようにスケジュールしたのか を確認することができます。
この図の例だと、下から4行目に date と、下から3行目に df -h というコマンド行が確認できます。
これにより、date と df -h を実行するようスケジュールされている ということがわかります。

このように、at –c JobID の実行結果の末尾に表示されるコマンド行を見て、どのコマンド行が実行されるように at でスケジュールされているか を確認することができます。

では、前回 ご紹介した atq と、今回の at –c JobID の実行例を基に、スケジュールされた内容の確認方法を具体的に解説します。

まずは、atq を実行して、いつ、誰が、どのJobID を実行するスケジュールしているのか確認 します。
上記の例では、4月12日14時0分に、student ユーザが、1 の JobID を実行するようスケジュールした ことがわかります。
次に、at -c 1 と実行して、末尾あたりに datedf -h が 表示されています。
これらにより、4月12日14時0分に student ユーザが date と df-h コマンドを実行するように、at コマンドを使用してスケジュールしたことが確認できました。

 

/var/spool/atディレクトリ

at –c JobID で表示された内容は、/var/spool/at ディレクトリにファイルとして納められています。

例えば、次の図は /var/spool/at ディレクトリを表示しています。

/var/spool/at ディレクトリ

このディレクトリに納められているファイルはテキスト形式で書かれています。
そのため、cat less などといったコマンドなどで表示し、スケジュールされている内容を直接確認することもできます。

例えば、次の図は /var/spool/at ディレクトリに納められたファイルの末尾あたりを確認しています。

ファイルの中身は、at –c JobID で表示されたものと同じです。
そのため、何が実行されるかを確認するときには ファイルの末尾あたりに注目 します。
この例では、下から4行目に date と、下から3行目に df -h というコマンド行が表示されていますので、それらが実行されるように指定されていることがわかります。

ただし at –c JobID と表示される内容は同じでなので、ファイルを直接見る利点は特にありません。
また、この /var/spool/at ディレクトリは、root ユーザしかアクセスできないように設定されていますので、直接ファイル内容を確認できるのは root ユーザだけです。

at でスケジュールすると、ユーザの環境設定や実行するよう指定したコマンドを含んだファイルがこの /var/spool/at ディレクトリに納められ、時間になるとそのファイルが実行されるという仕組みになっています。

また、そのディレクトリに収められているファイル名は、「キュー名」「JobID」「実行日時」の命名規則となります。
キュー名は、atq を実行したときに表示されていたアルファベットです(デフォルトはa)。
ここの JobID は5桁で表示されます。
末尾は、実行日時を表す数字ですが、読み取り方は少し特殊 です。
ファイルの末尾の日時は16進数で表示されますので、その数字を10進数に変換します。
そしてその数字に60を掛けます。
それにより、算出された数字がUNIX時間です。
UNIX時間は 1970/01/01の00:00:00 からの秒数です。

date +%s を実行すると、現在の日時をUNIX時間で表示 できます。
またUNIX時間を現在の日時で表示したいときには、date --date '@UNIX時間' と指定します。

例えば、前の図の /var/spool/at ディレクトリに、a000010173688c という名前のファイルが表示されています。
このファイル名を例にして考えていきます。

 a         <- キュー名
 00001     <- JobID
 0173688c  <- 日時

日時部分の 0173688c を10進数に変換すると 24340620、60を掛けると 1460437200、date –date ‘@1460437200’を実行すると2016年4月12日火曜日14:00:00となります。
これにより、 a000010173688c の名前のファイルは、キュー名がaで、JobIDが1で、4月12日14時0分に実行されることがわかりました。

このような計算をしなければ具体的な実行日時がわからないので、実行日時などは atq で確認することをお勧めします。
しかし、ファイルの名前には意味がある ことは理解していただけたかと思います。

 

まとめ

今回は、前々回、前回 に引き続き、at のスケジュールを確認する方法 をご紹介しました。

これで第3回となりました at ですが、他にもたくさんの使い方があります。
これらは、また次の機会にご紹介したいと思います。

次回のコラムも、どうぞお楽しみに。

記事は、予告なく変更または削除される場合があります。
記載された情報は、執筆・公開された時点のものであり、予告なく変更されている場合があります。
また、社名、製品名、サービス名などは、各社の商標または登録商標の場合があります。