よく、時間のかかる複数の処理をパラレルで実行し、かつ後からタスクの追加もさせたい、コマンドをキューのようなものに入れておいて処理させたいということがある。
ただ単に実行するコマンドをシェルスクリプトにしただけではこれはできないので、なにかいい感じのものはないかなーと探してみたところ、『Task Spooler
』なるツールがそのものズバリな機能を持っているようだ。
というわけで、早速試してみることにする。なお、OSはUbuntu Server 16.04 LTSを用いている。
1. インストール
Ubuntuであれば、aptでインストールができる(CentOS等の場合、ソースを取ってきてのコンパイルが必要になる)。
sudo apt install task-spooler
インストールできたら、tspを起動させよう。
tsp
2. 使ってみる
インストールができたら、実際に利用してみよう。 以下のようにコマンドを実行することで、処理をキューに追加できる(コマンドの追加時にジョブのIDを返してくれる)。
tsp COMMAND
引数無しでコマンドを実行すると、キューの情報(各ジョブのコマンドやログの出力先)を表示してくれる。
blacknon@BS-PUB-UBUNTU-01:~$ tsp
ID State Output E-Level Times(r/u/s) Command [run=1/1]
0 running /tmp/ts-out.38Pzw5 sleep 100
1 queued (file) sleep 101
2 queued (file) sleep 102
3 queued (file) sleep 103
4 queued (file) sleep 104
5 queued (file) sleep 105
6 queued (file) sleep 106
7 queued (file) sleep 107
8 queued (file) sleep 108
...
後は処理が完了するまで待つ…という感じなのだけど、オプションや環境変数で色々と指定できるようだ。
blacknon@BS-PUB-UBUNTU-01:~$ tsp -h
usage: tsp [action] [-ngfmdE] [-L ] [-D ] [cmd...]
Env vars:
TS_SOCKET the path to the unix socket used by the ts command.
TS_MAILTO where to mail the result (on -m). Local user by default.
TS_MAXFINISHED maximum finished jobs in the queue.
TS_MAXCONN maximum number of ts connections at once.
TS_ONFINISH binary called on job end (passes jobid, error, outfile, command).
TS_ENV command called on enqueue. Its output determines the job information.
TS_SAVELIST filename which will store the list, if the server dies.
TS_SLOTS amount of jobs which can run at once, read on server start.
TMPDIR directory where to place the output files and the default socket.
Actions:
-K kill the task spooler server
-C clear the list of finished jobs
-l show the job list (default action)
-S [num] get/set the number of max simultaneous jobs of the server.
-t [id] "tail -n 10 -f" the output of the job. Last run if not specified.
-c [id] like -t, but shows all the lines. Last run if not specified.
-p [id] show the pid of the job. Last run if not specified.
-o [id] show the output file. Of last job run, if not specified.
-i [id] show job information. Of last job run, if not specified.
-s [id] show the job state. Of the last added, if not specified.
-r [id] remove a job. The last added, if not specified.
-w [id] wait for a job. The last added, if not specified.
-u [id] put that job first. The last added, if not specified.
-U swap two jobs in the queue.
-B in case of full queue on the server, quit (2) instead of waiting.
-h show this help
-V show the program version
Options adding jobs:
-n don't store the output of the command.
-E Keep stderr apart, in a name like the output file, but adding '.e'.
-g gzip the stored output (if not -n).
-f don't fork into background.
-m send the output by e-mail (uses sendmail).
-d the job will be run only if the job before ends well
-D the job will be run only if the job of given id ends well.
-L name this task with a label, to be distinguished on listing.
-N number of slots required by the job (1 default).
以下、よく使うであろうオプションだけ抜粋してみる。
パラレルでの実行数を変更
デフォルトだとジョブの同時実行数は1となっているが、以下のコマンドで実行数を変更できる。
tsp -S <ジョブ同時実行数>
ジョブを削除する
-r <ジョブID>
で、指定したIDのジョブを削除する
tsp -r <ジョブID>
ジョブの標準出力の記録ファイルを確認する
ジョブの出力内容を保存しているファイルのPATHを確認する場合、-o <ジョブID>
で確認できる(リストからも確認できるけど)。
tsp -o <ジョブID>
また、ファイルの内容について確認したい場合はわざわざファイルを直接確認する必要はなく、「-c <ジョブID>
」でcat相当、「-t <ジョブID>
」でtail相当の確認ができる。
tsp -c <ジョブID> #cat相当
tsp -t <ジョブID> #tail相当
ジョブの情報を確認する
ジョブの情報(キューに追加した時間や終了時間などなど)を確認する場合は、-i <ジョブID>
で確認できる。
tsp -i <ジョブID>
blacknon@BS-PUB-UBUNTU-01:~$ tsp -i 101
Exit status: died with exit code 0
Command: ls -la
Slots required: 1
Enqueue time: Mon Jun 11 10:17:21 2018
Start time: Mon Jun 11 10:18:01 2018
End time: Mon Jun 11 10:18:01 2018
Time run: 0.005501s
ジョブの順番を入れ替える
「-U <ID>-<ID>
」で、指定したジョブID間の位置を入れ替える事ができる。
tsp -U <ID>-<ID>
最後に追加したジョブをキューの一番上にする
最後に追加したジョブをキューの一番上にもってくる(次に最優先で実行されるようにする)には、-u <ジョブID>
を実行する。
tsp -u <ジョブID>
終了したジョブをリストから削除する
終了したジョブをリストから削除(Clear)する場合は、-C
オプション付きでコマンドを実行する(出力ファイルも消えるので注意)。
tsp -C
tspを停止する
tspのプロセスを停止する場合は、-K
オプション付きでコマンドを実行する。
tsp -K
ものすごく便利だ。なんで今まで知らなかったのだろう。