As rookie

ルーキーインフラエンジニアがインフラのこと以外も結構書いてしまうブログ

POSIX1日1コマンド[part7]: batch

mokicks.hatenablog.com

詳細はこちらの記事へ。1日1POSIXコマンドを実行してみようというやつです。

batch

batch

とりあえず使ってみる

$ sudo systemctl status atd
● atd.service - Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2018-02-25 23:50:07 UTC; 22s ago
 Main PID: 3314 (atd)
   CGroup: /system.slice/atd.service
           └─3314 /usr/sbin/atd -f

Feb 25 23:50:07 localhost.localdomain systemd[1]: Started Job spooling tools.
Feb 25 23:50:07 localhost.localdomain systemd[1]: Starting Job spooling tools...

起動していなければ、

$ sudo systemctl start atd

・使う

# 事前のディレクトリ確認
$ ls
jobs

# jobの内容を表示
$ cat jobs
echo `date` >> sample.log

# batchコマンドに渡す
$ cat jobs | batch
job 22 at Mon Mar  5 19:03:00 2018

# 実行されている事がわかる
$ ls  
jobs  sample.log

# コマンドの実行結果がsample.logに追記されている。
cat sample.log 
Mon Mar 5 19:03:23 UTC 2018

・複数回キューに追加してみる

# 複数回実行
$ cat jobs | batch
job 33 at Mon Mar  5 19:12:00 2018
$ cat jobs | batch
job 34 at Mon Mar  5 19:12:00 2018
$ cat jobs | batch
job 35 at Mon Mar  5 19:12:00 2018
$ cat jobs | batch
job 36 at Mon Mar  5 19:12:00 2018
$ cat jobs | batch
job 37 at Mon Mar  5 19:12:00 2018
$ cat jobs | batch
job 38 at Mon Mar  5 19:12:00 2018
$ cat jobs | batch
job 39 at Mon Mar  5 19:12:00 2018
$ cat jobs | batch
job 40 at Mon Mar  5 19:12:00 2018

# sample.logを確認
$ cat sample.log 
Mon Mar 5 19:05:53 UTC 2018

この時点では追加されてい無い事がわかる。

# キューの内容内容を確認
# bというキューにたくさんキューがたまっている
$ atq
33 Mon Mar  5 19:12:00 2018 b vagrant
34 Mon Mar  5 19:12:00 2018 b vagrant
35 Mon Mar  5 19:12:00 2018 b vagrant
36 Mon Mar  5 19:12:00 2018 b vagrant
37 Mon Mar  5 19:12:00 2018 b vagrant
38 Mon Mar  5 19:12:00 2018 b vagrant
39 Mon Mar  5 19:12:00 2018 b vagrant
40 Mon Mar  5 19:12:00 2018 b vagrant

# 少し時間を置く
$ atq
35 Mon Mar  5 19:12:00 2018 b vagrant
36 Mon Mar  5 19:12:00 2018 b vagrant
37 Mon Mar  5 19:12:00 2018 b vagrant
38 Mon Mar  5 19:12:00 2018 b vagrant
39 Mon Mar  5 19:12:00 2018 b vagrant
40 Mon Mar  5 19:12:00 2018 b vagrant

少し時間がたってキューの中身が減っているのがわかる。

キュー内のコマンドが実行されたことを意味するので、sample.log にも処理内容が追記されている。

$ cat sample.log 
Mon Mar 5 19:14:53 UTC 2018
Mon Mar 5 19:15:53 UTC 2018
Mon Mar 5 19:16:53 UTC 2018

ざっくり使い方

<command> | batch

ざっくりDESCRIPTION

バッチ・キュー内で実行されるコマンドをスケジュールする。
標準入力からコマンドを読み取り、バッチ・キュー内で実行するようにスケジュールします。それは以下のコマンドと同等です:

at -q b -m now

(atコマンドで 「b」というキュータスクを追加する。) ここで、キューbは特別なキュー、特にバッチ・ジョブ用です。バッチ・ジョブは、時間制約なしでバッチ・キューに提出され、バッチの呼び出しごとに異なる不特定の要因に基づいてアルゴリズムを使用してシステムによって実行されます。

実装定義のディレクトリにあるat.allow(/etc/at.allow)ファイルに名前が表示されている場合、ユーザはバッチを使用することが許可されます。そのファイルが存在しない場合、実装定義のディレクトリにあるat.deny(/etc/at.deny)ファイルをチェックして、ユーザがバッチへのアクセスを拒否されるかどうかを判断しなければなりません。いずれのファイルも存在しない場合、適切な特権を持つプロセスだけがジョブをサブミットすることが許されます。 at.denyだけが存在し、空である場合、グローバルな使用が許可されます。 at.allowファイルとat.denyファイルは、1行に1つのユーザー名で構成されます。

ざっくりOPTION

なし(batchコマンド自体にはなし)

ざっくりOPERANDS

なし(batchコマンド自体にはなし)

ざっくりまとめ

以前に使ってみた、atコマンド の 「負荷が少ないときに処理を実行するバージョン」だそうです。

mokicks.hatenablog.com

Linux の at, batch コマンド

atコマンドをざっくりとしか使ってい無いため、使用感まではわかりませんでしたが、処理に時間がかかり、他の処理を優先させたい場合にbatchを使うのは良いかもしれません。

また、

man batch

を実行すると、atコマンドのmanが表示され、その中の一つの要素としてbatchが存在します。