Cron
コンピュータの世界で最も有名なUNIXismの1つです。 Linuxサーバーを管理していないIT担当者でさえ、その謎の獣、「cronジョブ」について聞いたことがあるでしょう。また、Linux管理者は、cronジョブが際限なく役立つことを知っています。実際、 cron
は議論の余地があります システムは、自動化ブームの初期の先駆者でした。人間が忘れることができるとわかっていることがあれば、 cron
答えでした。
ただし、 cron
優れているのは繰り返しであり、1時間ごと、毎日、または毎週実行するためのジョブが必要ない場合もあります。スケジュールどおりに実行する必要があるのはジョブだけであり、アラームを設定して自分自身を思い出させるのは、UNIXの方法とは思えません。必要なのはat
コマンド、 atで実行するようにスケジュールされたジョブのキューを作成するために使用できる小さなユーティリティ 将来の特定の時間。
セットアップ
at
を使用する前に コマンドを実行するには、いつか起動するシェルスクリプトが必要です。いつものように、スクリプトのファイルの先頭に「マジッククッキー」または「シバン」の行を入れて、実行に使用するシェルを設定する必要があります。
この例では、ファイルを作成する簡単なスクリプトを作成します。 / tmp
:
#!/bin/sh
DATE=`date --utc +%s`
echo "hello world $DATE" | tee /tmp/at.log
exit 0
スクリプトを実行可能にしてから、テストを実行します。
$ chmod +x test.sh
$ ./test.sh
/tmp/at.log
の内容を表示する 作成したスクリプトをファイルします:
$ cat /tmp/at.log
hello world 1588482185
ジョブのスケジュール
タイムスタンプまたは自然言語を使用してジョブをスケジュールできます。自然言語または単純な時間形式を使用する場合は、時間を指定する前にオプションは必要ありません。
たとえば、 test.sh
をスケジュールする場合 すぐに実行するには、キーワード now
を使用するだけです。 :
$ at now -f test.sh
warning: commands will be executed using /bin/sh
job 1 at Mon Feb 24 01:23:00 2020
$ cat /tmp/at.log
hello world 1588482620
今からのオフセットを設定できます minutes
を使用する 、時間コード> 、
日
、週
、または years
。
$ at now + 1 day -f test.sh
warning: commands will be executed using /bin/sh
job 2 at Tue Feb 25 01:27:00 2020
年コード> キーワードは文書化されておらず、
seconds
サポートされていません。 midnight
などの一般的な時刻も指定できます 、正午
、および teatime
(16:00です)
単純な時間も機能します:
$ at 21:12 -f test.sh
warning: commands will be executed using /bin/sh
job 3 at Mon Feb 24 21:12:00 2020
特定の時刻にカレンダーの日付をスケジュールするには、 -t
を使用する必要があります オプションおよびPOSIX準拠の時間形式。たとえば、YYYYMMDDHHMM形式を使用します。
$ at -t 202003141509 -f test.sh
warning: commands will be executed using /bin/sh
job 4 at Sat Mar 14 15:09:00 2020
[より高度なシステム自動化をお探しですか? RedHatの無料の本であるTheAutomatedEnterpriseを始めましょう。 ]
パイプP>
at
にコマンドを送信できます UNIXパイプ経由:
$ echo "hello world" > /tmp/at.log | at now
warning: commands will be executed using /bin/sh
job 5 at Mon Feb 24 01:28:00 2020
$ cat /tmp/at.log
hello world
バッチジョブ
バッチ
コマンド(または at -b
)システムリソースが許す限り早くコマンドを実行します。システムの負荷が高い場合は、 batch
を使用できます CPUサイクルに余裕がある場合に、実行するジョブをキューに入れます。
$ echo "Cycles to spare" > /tmp/at.log | batch
warning: commands will be executed using /bin/sh
job 5 at Mon Feb 24 01:31:00 2020
キューの表示
atq
コマンドはat
を表示します 列。これにより、ジョブID、各ジョブの実行がスケジュールされている時間、各ジョブがグループ化されているキュー( a
)がわかります。 at
の場合 キューまたはb
batch
の場合 queue)、およびキュー所有者のユーザー名。 atq
を実行している場合を除き、通常、キューの所有者は自分自身です。 ルートとして。この場合、すべてのユーザーの at
が表示されます。 キュー。
$ atq
2 Tue Feb 25 01:27:00 2020 a seth
3 Mon Feb 24 21:12:00 2020 a seth
4 Sat Mar 14 15:09:00 2020 a seth
5 Mon Feb 24 01:31:00 2020 b seth
任意の単一文字c-zを使用して、独自のキューを作成して名前を付けることができます またはA-Z 。両方のa
およびb
at
の予約済み指定です およびbatch
、および大文字のキューはすべて batch
として扱われます 仕事。 a
のアルファベット順に続く名前のキュー およびb
ますます快適に実行されます。
仕事のプレビュー
コマンドまたはスクリプトをat
に送信する場合 、現在の作業ディレクトリ、環境( BASH_VERSINFO
を除く) 、 DISPLAY
、 EUID
、 GROUPS
、 SHELLOPTS
、 TERM
、 UID
、および _
)、およびumaskは保持されます。コマンドで特定の環境設定が必要な場合は、コマンドを at
に渡すときにそれらを設定する必要があります。 または、スクリプトでそれらをオーバーライドします。
コマンドがどのように実行されるかを確認するには、 -c
を使用します オプションとジョブ番号:
$ at -c 4
#!/bin/sh
# atrun uid=1006 gid=1006
# mail seth 0
umask 22
CPLUS_INCLUDE_PATH=/usr/lib64/qt/include; export CPLUS_INCLUDE_PATH
MANPATH=/usr/local/man:/usr/man:/usr/lib64/adoptopenjdk12.0.2/man; export MANPATH
KDE_MULTIHEAD=false; export KDE_MULTIHEAD
[...]
ジョブの削除
at
から保留中のジョブを削除できます atrm
を使用してキューに入れる コマンドとジョブID。ジョブIDがわからない場合は、 atq
を使用してください 最初にキューを表示します。
$ atq
6 Fri Jan 01 00:00:00 2038 a seth
$ atrm 6
$ atq
atでのスケジューリング
at
コマンドは、より小さな cron
に少し似ています システム。 1回限りのコマンド実行に便利で使いやすいです。 cron
を使用している場合 またはsleep
コマンドの実行時間を相殺するには、 at
を見てください。 およびbatch
。
[Linuxシステム管理についてもっと知る必要がありますか? RedHatシステム管理コースの受講を検討してください。 ]