コンテンツにスキップ

時間のかかるコマンドをバックグラウンドで並列実行する

背景

CLI コマンドを実行する際に、時間がかかる処理を複数実行することがある。このような場合にバックグラウンド実行と並列処理を組み合わせて効率的に処理できると嬉しい。

pueue を使ったバックグラウンドでの並列実行

pueueを使ってコマンド実行を管理することで、バックグラウンドでの並列実行が可能になる。 pueue は、長時間のシェルコマンドを順番または並列に実行するためのコマンドラインタスク管理ツール。次のような特徴と機能を持つ。

  • タスクの追加、削除、一時停止、再開、再起動、キャンセル、並び替えが可能
  • タスクの出力をリアルタイムで表示
  • タスクのグループ化
  • タスクの依存関係の指定
  • 並列実行
  • 作業ディレクトリの指定...etc

基本的な使い方

Quote
    Interact with the Pueue daemon

Usage: pueue [OPTIONS] [COMMAND]

Commands:
  add            Enqueue a task for execution.
                    There're many different options when scheduling a task.
                    Check the individual option help texts for more information.

                    Furthermore, please remember that scheduled commands are executed via your system shell.
                    This means that the command needs proper shell escaping.
                    The safest way to preserve shell escaping is to surround your command with quotes, for example:
                    pueue add 'ls $HOME && echo "Some string"'
  remove         Remove tasks from the list. Running or paused tasks need to be killed first
  switch         Switches the queue position of two commands. Only works on queued and stashed commands
  stash          Stashed tasks won't be automatically started. You have to enqueue them or start them by hand
  enqueue        Enqueue stashed tasks. They'll be handled normally afterwards
  start          Resume operation of specific tasks or groups of tasks.
                    By default, this resumes the default group and all its tasks.
                    Can also be used force-start specific tasks.
  restart        Restart failed or successful task(s).
                    By default, identical tasks will be created and enqueued, but it's possible to restart in-place.
                    You can also edit a few properties, such as the path and the command, before restarting.
  pause          Either pause running tasks or specific groups of tasks.
                    By default, pauses the default group and all its tasks.
                    A paused queue (group) won't start any new tasks.
  kill           Kill specific running tasks or whole task groups..
                    Kills all tasks of the default group when no ids or a specific group are provided.
  send           Send something to a task. Useful for sending confirmations such as 'y\n'
  edit           Edit the command, path or label of a stashed or queued task.
                    By default only the command is edited.
                    Multiple properties can be added in one go.
  group          Use this to add or remove groups.
                    By default, this will simply display all known groups.
  status         Display the current status of all tasks
  format-status  Accept a list or map of JSON pueue tasks via stdin and display it just like "pueue status".
                    A simple example might look like this:
                    pueue status --json | jq -c '.tasks' | pueue format-status
  log            Display the log output of finished tasks.
                    Only the last few lines will be shown by default.
                    If you want to follow the output of a task, please use the "follow" subcommand.
  follow         Follow the output of a currently running task. This command works like "tail -f"
  wait           Wait until tasks are finished.
                    By default, this will wait for all tasks in the default group to finish.
                    Note: This will also wait for all tasks that aren't somehow 'Done'.
                    Includes: [Paused, Stashed, Locked, Queued, ...]
  clean          Remove all finished tasks from the list
  reset          Kill all tasks, clean up afterwards and reset EVERYTHING!
  shutdown       Remotely shut down the daemon. Should only be used if the daemon isn't started by a service manager
  parallel       Set the amount of allowed parallel tasks
                    By default, adjusts the amount of the default group.
                    No tasks will be stopped, if this is lowered.
                    This limit is only considered when tasks are scheduled.
  completions    Generates shell completion files. This can be ignored during normal operations
  help           Print this message or the help of the given subcommand(s)

Options:
  -v, --verbose...         Verbose mode (-v, -vv, -vvv)
      --color <COLOR>      Colorize the output; auto enables color output when connected to a tty [default: auto] [possible values: auto, never, always]
  -c, --config <CONFIG>    If provided, Pueue only uses this config file. This path can also be set via the "PUEUE_CONFIG_PATH" environment variable. The commandline option overwrites the environment variable!
  -p, --profile <PROFILE>  The name of the profile that should be loaded from your config file
  -h, --help               Print help
  -V, --version            Print version

pueue を利用するには事前にデーモンを起動する必要がある。次のコマンドでデーモンを起動する。

pueue -d

デーモンを起動したら、次のようにタスクを追加する。

pueue add "sleep 10; echo 'Task 1 done'"

次のコマンドでタスクの状態を確認する。

pueue status

次のコマンドでログを表示する。

pueue log

並列実行数を指定するには、次のコマンドを実行する。0 を指定すると並列実行数の制限がなくなる。

pueue parallel 2

タスクの完了を待つ場合は、次のコマンドを実行する。

pueue wait

実際に使ってみて

pueue 実際に使ってみて、次のようなことを意識するとより効果的に使えると感じた。

  1. group 機能を使ってタスクをグループ化する。全て同じグループで実行すると、フィルタリングが難しくなる
  2. add コマンドでタスクを追加する際に、変数展開が実際にされるかを確認する。$(var) は展開されるが、$var${var} は展開されなかった

類似ツール