Task Spooler を試した

34
Task Spooler を試した 内山 雄司 (@y__uti) 2016-09-13 社内勉強会

Transcript of Task Spooler を試した

Page 1: Task Spooler を試した

Task Spoolerを試した内山 雄司 (@y__uti)

2016-09-13 社内勉強会

Page 2: Task Spooler を試した

自己紹介内山雄司 (@y__uti)

◦ http://y-uti.hatenablog.jp/ (phpusers-ja)

仕事◦ 受託開発の会社 (株式会社ピコラボ) でプログラマをしています

興味◦ プログラミング言語処理系

◦ 機械学習

2016-09-13 社内勉強会 2

Page 3: Task Spooler を試した

Task Spoolerhttp://vicerveza.homeunix.net/~viric/soft/ts/

2016-09-13 社内勉強会 3

Page 4: Task Spooler を試した

Task Spooler とは?簡易ジョブ管理システム的なもの

Task Spooler ができること◦ 最大同時実行数を設定してプロセスを並列実行する

◦ プロセスの状態や実行結果を管理する

◦ プロセスの実行条件 (依存関係) を指定する

Task Spooler ではできないこと◦ 複雑なことは概ねできない

◦ ジョブの実行時刻を指定するとか (cronじゃないから)

◦ 異常終了したら通知するとか

◦ トリッキーなジョブを仕掛ければできるかもしれないが・・・

2016-09-13 社内勉強会 4

Page 5: Task Spooler を試した

何をしてくれるのか最大同時実行数を設定してプロセスを並列実行する

2016-09-13 社内勉強会 5

実行待ち 実行中 実行済み

Page 6: Task Spooler を試した

何をしてくれるのか最大同時実行数を設定してプロセスを並列実行する

2016-09-13 社内勉強会 6

実行待ち 実行中 実行済み

終わった!

Page 7: Task Spooler を試した

何をしてくれるのか最大同時実行数を設定してプロセスを並列実行する

2016-09-13 社内勉強会 7

実行待ち 実行中 実行済み

次!

Page 8: Task Spooler を試した

インストールソースコードを取得してビルドする

2016-09-13 社内勉強会 8

$ wget http://vicerveza.homeunix.net/~viric/soft/ts/ts-0.7.6.tar.gz$ tar xf ts-0.7.6.tar.gz$ cd ts-0.7.6$ make$ make PREFIX=.. install

◦ インストールされるのは以下の 2 ファイル

◦ $PREFIX/bin/ts

◦ $PREFIX/share/man/man1/ts.1

◦ ちなみに GPL version 2.0

Page 9: Task Spooler を試した

基本的な使い方 [1/2]最大同時実行数を設定する

2016-09-13 社内勉強会 9

$ ts -S 4

◦ 4 プロセスまで同時実行

確認

$ ts

ID State Output E-Level Times(r/u/s) Command [run=0/4]

Page 10: Task Spooler を試した

基本的な使い方 [2/2]ジョブをキューに登録する

2016-09-13 社内勉強会 10

$ for i in $(seq 1 10); do ts sleep $i; done0123456789

◦ i = 1 ~ 10 として「$i秒 sleep する」ジョブを登録した

Page 11: Task Spooler を試した

実行の様子キューの状態を確認する

実行直後

2016-09-13 社内勉強会 11

$ ts

ID State Output E-Level Times(r/u/s) Command [run=4/4]0 running /tmp/ts-out.sWEDhd sleep 11 running /tmp/ts-out.2FZb9f sleep 22 running /tmp/ts-out.g4nEOg sleep 33 running /tmp/ts-out.E7hDyg sleep 44 queued (file) sleep 55 queued (file) sleep 66 queued (file) sleep 77 queued (file) sleep 88 queued (file) sleep 99 queued (file) sleep 10

Page 12: Task Spooler を試した

実行の様子キューの状態を確認する

1秒後

2016-09-13 社内勉強会 12

$ ts

ID State Output E-Level Times(r/u/s) Command [run=4/4]1 running /tmp/ts-out.2FZb9f sleep 22 running /tmp/ts-out.g4nEOg sleep 33 running /tmp/ts-out.E7hDyg sleep 44 running /tmp/ts-out.iNqnyi sleep 55 queued (file) sleep 66 queued (file) sleep 77 queued (file) sleep 88 queued (file) sleep 99 queued (file) sleep 100 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 1

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 13: Task Spooler を試した

実行の様子キューの状態を確認する

2秒後

2016-09-13 社内勉強会 13

$ ts

ID State Output E-Level Times(r/u/s) Command [run=4/4]2 running /tmp/ts-out.g4nEOg sleep 33 running /tmp/ts-out.E7hDyg sleep 44 running /tmp/ts-out.iNqnyi sleep 55 running /tmp/ts-out.zLJ4Ci sleep 66 queued (file) sleep 77 queued (file) sleep 88 queued (file) sleep 99 queued (file) sleep 100 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 11 finished /tmp/ts-out.2FZb9f 0 2.02/0.00/0.00 sleep 2

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 14: Task Spooler を試した

実行の様子キューの状態を確認する

3秒後

2016-09-13 社内勉強会 14

$ ts

ID State Output E-Level Times(r/u/s) Command [run=4/4]3 running /tmp/ts-out.E7hDyg sleep 44 running /tmp/ts-out.iNqnyi sleep 55 running /tmp/ts-out.zLJ4Ci sleep 66 running /tmp/ts-out.kjWcqk sleep 77 queued (file) sleep 88 queued (file) sleep 99 queued (file) sleep 100 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 11 finished /tmp/ts-out.2FZb9f 0 2.02/0.00/0.00 sleep 22 finished /tmp/ts-out.g4nEOg 0 3.01/0.00/0.00 sleep 3

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 15: Task Spooler を試した

実行の様子キューの状態を確認する

・・・

2016-09-13 社内勉強会 15

$ ts

ID State Output E-Level Times(r/u/s) Command [run=4/4]4 running /tmp/ts-out.iNqnyi sleep 55 running /tmp/ts-out.zLJ4Ci sleep 66 running /tmp/ts-out.kjWcqk sleep 77 running /tmp/ts-out.i9BXum sleep 88 queued (file) sleep 99 queued (file) sleep 100 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 11 finished /tmp/ts-out.2FZb9f 0 2.02/0.00/0.00 sleep 22 finished /tmp/ts-out.g4nEOg 0 3.01/0.00/0.00 sleep 33 finished /tmp/ts-out.E7hDyg 0 4.00/0.00/0.00 sleep 4

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 16: Task Spooler を試した

実行の様子キューの状態を確認する

・・・

2016-09-13 社内勉強会 16

$ ts

ID State Output E-Level Times(r/u/s) Command [run=4/4]5 running /tmp/ts-out.zLJ4Ci sleep 66 running /tmp/ts-out.kjWcqk sleep 77 running /tmp/ts-out.i9BXum sleep 88 running /tmp/ts-out.AWi5Dq sleep 99 queued (file) sleep 100 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 11 finished /tmp/ts-out.2FZb9f 0 2.02/0.00/0.00 sleep 22 finished /tmp/ts-out.g4nEOg 0 3.01/0.00/0.00 sleep 33 finished /tmp/ts-out.E7hDyg 0 4.00/0.00/0.00 sleep 44 finished /tmp/ts-out.iNqnyi 0 5.01/0.00/0.00 sleep 5

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 17: Task Spooler を試した

実行の様子キューの状態を確認する

・・・

2016-09-13 社内勉強会 17

$ ts

ID State Output E-Level Times(r/u/s) Command [run=4/4]6 running /tmp/ts-out.kjWcqk sleep 77 running /tmp/ts-out.i9BXum sleep 88 running /tmp/ts-out.AWi5Dq sleep 99 running /tmp/ts-out.kVAX0u sleep 100 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 11 finished /tmp/ts-out.2FZb9f 0 2.02/0.00/0.00 sleep 22 finished /tmp/ts-out.g4nEOg 0 3.01/0.00/0.00 sleep 33 finished /tmp/ts-out.E7hDyg 0 4.00/0.00/0.00 sleep 44 finished /tmp/ts-out.iNqnyi 0 5.01/0.00/0.00 sleep 55 finished /tmp/ts-out.zLJ4Ci 0 6.01/0.00/0.00 sleep 6

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 18: Task Spooler を試した

実行の様子キューの状態を確認する

・・・

2016-09-13 社内勉強会 18

$ ts

ID State Output E-Level Times(r/u/s) Command [run=3/4]7 running /tmp/ts-out.i9BXum sleep 88 running /tmp/ts-out.AWi5Dq sleep 99 running /tmp/ts-out.kVAX0u sleep 100 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 11 finished /tmp/ts-out.2FZb9f 0 2.02/0.00/0.00 sleep 22 finished /tmp/ts-out.g4nEOg 0 3.01/0.00/0.00 sleep 33 finished /tmp/ts-out.E7hDyg 0 4.00/0.00/0.00 sleep 44 finished /tmp/ts-out.iNqnyi 0 5.01/0.00/0.00 sleep 55 finished /tmp/ts-out.zLJ4Ci 0 6.01/0.00/0.00 sleep 66 finished /tmp/ts-out.kjWcqk 0 7.00/0.00/0.00 sleep 7

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 19: Task Spooler を試した

実行の様子キューの状態を確認する

・・・

2016-09-13 社内勉強会 19

$ ts

ID State Output E-Level Times(r/u/s) Command [run=2/4]8 running /tmp/ts-out.AWi5Dq sleep 99 running /tmp/ts-out.kVAX0u sleep 100 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 11 finished /tmp/ts-out.2FZb9f 0 2.02/0.00/0.00 sleep 22 finished /tmp/ts-out.g4nEOg 0 3.01/0.00/0.00 sleep 33 finished /tmp/ts-out.E7hDyg 0 4.00/0.00/0.00 sleep 44 finished /tmp/ts-out.iNqnyi 0 5.01/0.00/0.00 sleep 55 finished /tmp/ts-out.zLJ4Ci 0 6.01/0.00/0.00 sleep 66 finished /tmp/ts-out.kjWcqk 0 7.00/0.00/0.00 sleep 77 finished /tmp/ts-out.i9BXum 0 8.01/0.00/0.00 sleep 8

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 20: Task Spooler を試した

実行の様子キューの状態を確認する

・・・

2016-09-13 社内勉強会 20

$ ts

ID State Output E-Level Times(r/u/s) Command [run=1/4]9 running /tmp/ts-out.kVAX0u sleep 100 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 11 finished /tmp/ts-out.2FZb9f 0 2.02/0.00/0.00 sleep 22 finished /tmp/ts-out.g4nEOg 0 3.01/0.00/0.00 sleep 33 finished /tmp/ts-out.E7hDyg 0 4.00/0.00/0.00 sleep 44 finished /tmp/ts-out.iNqnyi 0 5.01/0.00/0.00 sleep 55 finished /tmp/ts-out.zLJ4Ci 0 6.01/0.00/0.00 sleep 66 finished /tmp/ts-out.kjWcqk 0 7.00/0.00/0.00 sleep 77 finished /tmp/ts-out.i9BXum 0 8.01/0.00/0.00 sleep 88 finished /tmp/ts-out.AWi5Dq 0 9.00/0.00/0.00 sleep 9

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 21: Task Spooler を試した

実行の様子キューの状態を確認する

終わり

2016-09-13 社内勉強会 21

$ ts

ID State Output E-Level Times(r/u/s) Command [run=0/4]0 finished /tmp/ts-out.sWEDhd 0 1.01/0.00/0.00 sleep 11 finished /tmp/ts-out.2FZb9f 0 2.02/0.00/0.00 sleep 22 finished /tmp/ts-out.g4nEOg 0 3.01/0.00/0.00 sleep 33 finished /tmp/ts-out.E7hDyg 0 4.00/0.00/0.00 sleep 44 finished /tmp/ts-out.iNqnyi 0 5.01/0.00/0.00 sleep 55 finished /tmp/ts-out.zLJ4Ci 0 6.01/0.00/0.00 sleep 66 finished /tmp/ts-out.kjWcqk 0 7.00/0.00/0.00 sleep 77 finished /tmp/ts-out.i9BXum 0 8.01/0.00/0.00 sleep 88 finished /tmp/ts-out.AWi5Dq 0 9.00/0.00/0.00 sleep 99 finished /tmp/ts-out.kVAX0u 0 10.00/0.00/0.00 sleep 10

◦ 一秒ごとに tsコマンドを実行しています

◦ 自動更新されるわけではない

Page 22: Task Spooler を試した

tsのオプション [1/3]ジョブの情報を確認する

2016-09-13 社内勉強会 22

オプション 意味

-t [id] 指定されたジョブの出力を tail -f する

-c [id] 指定されたジョブの出力を cat する

-p [id] 指定されたジョブのプロセス ID を表示する

-o [id] 指定されたジョブの出力ファイル名を表示する

-i [id] 指定されたジョブの情報を表示する

-s [id] 指定されたジョブの状態を表示する

Page 23: Task Spooler を試した

ts -i [id]指定されたジョブの情報を表示する

2016-09-13 社内勉強会 23

$ ts -i 3Exit status: died with exit code 0Command: sleep 4Slots required: 1Enqueue time: Mon Sep 12 22:07:56 2016Start time: Mon Sep 12 22:07:56 2016End time: Mon Sep 12 22:08:00 2016Time run: 4.004059s

Page 24: Task Spooler を試した

tsのオプション [2/3]ジョブの実行を制御する

2016-09-13 社内勉強会 24

オプション 意味

-r [id] 指定されたジョブをキューから取り除く

-w [id] 指定されたジョブが終わるまで待つ

-k [id] 指定されたジョブを kill する (SIGTERM)

-u [id] 指定されたジョブをキューの先頭に移動する

-U <id>-<id> 指定された二つのジョブの位置を入れ替える

Page 25: Task Spooler を試した

tsのオプション [3/3]ジョブを登録するときのオプション

2016-09-13 社内勉強会 25

オプション 意味

-n ジョブの出力をファイルに保存しない

-E ジョブの標準出力と標準エラーを分けて出力する

-g ジョブの出力を gzipする

-f バックグラウンドで fork しない (未確認)

-m ジョブの出力をメールで送信する (未確認)

-d 直前のジョブが正常終了したときだけ実行する

-D <id> 指定されたジョブが正常終了したときだけ実行する

-L <lab> ジョブに名前を付ける

-N <num> ジョブが使うスロット数を指定する

Page 26: Task Spooler を試した

ts -D [id]指定されたジョブが正常終了したときだけ実行する

2016-09-13 社内勉強会 26

$ ts -S 2$ ts sleep 200$ ts sleep 101$ ts -D 0 sleep 52$ ts sleep 53

◦ ID = 2 のジョブは ID = 0 のジョブが正常終了したら実行が始まる

Page 27: Task Spooler を試した

実行の様子実行直後

2016-09-13 社内勉強会 27

$ ts

ID State Output E-Level Times(r/u/s) Command [run=2/2]0 running /tmp/ts-out.flebwV sleep 201 running /tmp/ts-out.RGTygW sleep 102 queued (file) [0]&& sleep 53 queued (file) sleep 5

Page 28: Task Spooler を試した

実行の様子10 秒後

2016-09-13 社内勉強会 28

$ ts

ID State Output E-Level Times(r/u/s) Command [run=2/2]0 running /tmp/ts-out.flebwV sleep 202 queued (file) [0]&& sleep 53 running /tmp/ts-out.4MUpNi sleep 51 finished /tmp/ts-out.RGTygW 0 10.01/0.00/0.00 sleep 10

◦ ID = 1 のジョブが終了する

◦ ID = 2 のジョブは ID = 0 を待っているので実行が開始されない

◦ ID = 3 のジョブの実行が開始される

Page 29: Task Spooler を試した

実行の様子15 秒後

2016-09-13 社内勉強会 29

$ ts

ID State Output E-Level Times(r/u/s) Command [run=1/2]0 running /tmp/ts-out.flebwV sleep 202 queued (file) [0]&& sleep 51 finished /tmp/ts-out.RGTygW 0 10.01/0.00/0.00 sleep 103 finished /tmp/ts-out.4MUpNi 0 5.01/0.00/0.00 sleep 5

◦ ID = 3 のジョブが終了する

◦ ID = 2 のジョブは ID = 0 を待っているので実行が開始されない

Page 30: Task Spooler を試した

実行の様子20 秒後

2016-09-13 社内勉強会 30

$ ts

ID State Output E-Level Times(r/u/s) Command [run=1/2]2 running /tmp/ts-out.c9eVnz [0]&& sleep 51 finished /tmp/ts-out.RGTygW 0 10.01/0.00/0.00 sleep 103 finished /tmp/ts-out.4MUpNi 0 5.01/0.00/0.00 sleep 50 finished /tmp/ts-out.flebwV 0 20.01/0.00/0.00 sleep 20

◦ ID = 0 のジョブが終了する

◦ ID = 2 のジョブの実行が開始される

Page 31: Task Spooler を試した

実行の様子25 秒後

2016-09-13 社内勉強会 31

$ ts

ID State Output E-Level Times(r/u/s) Command [run=0/2]1 finished /tmp/ts-out.RGTygW 0 10.01/0.00/0.00 sleep 103 finished /tmp/ts-out.4MUpNi 0 5.01/0.00/0.00 sleep 50 finished /tmp/ts-out.flebwV 0 20.01/0.00/0.00 sleep 202 finished /tmp/ts-out.c9eVnz 0 5.01/0.00/0.00 [0]&& sleep 5

◦ ID = 2 のジョブが終了する

Page 32: Task Spooler を試した

ところで-D って複数指定できるの?◦ できない!

◦ 右図のような制御ができない

プログラムを修正すればできる◦ 実際できた

◦ -D の値を intで持っているのを配列に変更するだけ

2016-09-13 社内勉強会 32

ここができない!

Page 33: Task Spooler を試した

tsの後片付けバックグラウンドの tsサーバプロセスを終了する

2016-09-13 社内勉強会 33

$ ts -K

◦ 必要になったとき (ジョブを登録したとき等) に自動起動している

Page 34: Task Spooler を試した

おわり詳細は ts -h

説明していないオプションもあるよ

2016-09-13 社内勉強会 34