Nushell job control

2022/12/05に公開

Job control

Nushell Ver 0.72の段階ではまだ、Job controlが実装されていません。このためCtrl-Zが効かない、バックグラウンドジョブが実行できません。Nu本にあるようにNukesor/pueue: Manage your shell commands.と連携してジョブ制御を行えるようにします。

Pueueを使ったジョブ制御

Pueue は、実行時間の長いタスクを順次および並列に実行するためのコマンドラインのタスク管理ツールです。

以下はFAQより。

最もよくある質問の 1 つは、Tmux や Screen などのターミナル マルチプレクサがある場合に、そもそもなぜ Pueue を使用する必要があるのか​​ということです。

私の回答は、これらには多くの便利な機能が欠けているということです。
以下は、Pueue の基本機能の例です。

  • コマンドをキューに入れ、一度にすべてを開始しない機能
  • 並行して実行するタスクの数を指定する
  • タスクの簡単な一時停止/再開
  • 見やすくアクセスしやすいタスク ステータスの概要
  • 複数の tmux セッションにアタッチする必要はありません
  1. Install pueue
    以下はarm64アーキテクチャ向けのインストール手順ですが、参考までにインストール方法を示します。
wget https://github.com/Nukesor/pueue/releases/download/v2.1.0/pueued-linux-aarch64
chmod a+x pueued-linux-aarch64
mv pueued-linux-aarch64 $HOME/.cargo/bin/pueued
wget https://github.com/Nukesor/pueue/releases/download/v2.1.0/pueue-linux-aarch64
chmod a+x pueue-linux-aarch64
mv pueue-linux-aarch64 $HOME/.cargo/bin/pueue
wget https://github.com/Nukesor/pueue/releases/download/v2.1.0/systemd.pueued.service
sed -i -e "s#/usr/bin/#$HOME/.cargo/bin/#" pueued.service
mkdir -p $HOME/.config/systemd/user
mv systemd.pueued.service $HOME/.config/systemd/user
systemctl --user start pueued.service #サービス起動
systemctl --user enable pueued.service #サービス自動起動有効
  1. Download job.nu

  2. cp job.nu $env.NU_LIB_DIRS

  3. use job.nu の行を $nu.config-path に追記

次のコマンドが使えます。

  • job spawn [block]
    引数のブロックをバックグラウンドジョブとして登録します。
  • job kill <id>
    指定IDのジョブを削除します。
  • job clean
    ジョブのログを削除します。
  • job status
    ジョブの状態を表示します。
❯ job status | get Done.0
Success
  • job log <id>
    指定IDのジョブ実行時のログを表示します。

応用例

clipnotifyxselを使ったclipboardの内容をテキストに書き溜めるツールです。実行部分はNushellのスクリプトです。
下記を$env.NU_LIB_DIRSディレクトリにclip.nuとして保存。$nu.config-pathのNushell設定ファイルにuse clip.nuを追記します。

# clip.nu
export def capture [] {
    loop { 
        # clipnotifyはクリップポートに変化があると終了する
        ^clipnotify -s clipboard;
        # クリップボード履歴ファイル(clipboard.txt)を開いて、
        # xsel コマンドより最新のクリップボード内容を追記して
        # 最大100行となるよう保存
        open ~/.cache/clipboard.txt 
        | append (^xsel -bo) 
        | to text 
        | ^tail -n 100 
        | save -r  ~/.cache/clipboard.txt
    }
}

次の手順で上記をpueueに登録して実行させます。

  1. touch ~/.cache/clipboard.txt
  2. job spawn {clip capture}
  3. なにかをクリップボードへ
  4. cat ~/.cache/clipboard.txt

clipnotify

X11のclipboard, primary, secondaryを監視するコマンドです。基本は監視対象に変化があった場合に終了します。-lオプションでは終了せず、状態変化時に標準出力を出力します。-sオプションで監視対象を選択します。下記はクリップボードを監視するための設定となります。

clipnotify -s clipboard
  1. (github)[https://github.com/cdown/clipnotify]よりダウンロードして,
  2. cd clipnotify
  3. make
  4. cp clipnotify path/to/ # PATH設定されているフォルダにコピー

xsel

コマンドがない場合、適宜apt installしてください。

Tips

今回xselコマンドを使いましたが、オプションを-bのみでNushellのinteractiveモードで動作することを確認して、pueueでジョブ投入するとxselがSleep状態となり、全体の動作が停止してしまいました。そこでstraceコマンドでattachするとread(0,となっており、標準入力待ちであることがわかり、man xselで調べると下記のようになっており、オプションを-boに変更して動作するようになりました。

  By default, this program outputs the selection without modification  if
  both  standard  input  and standard output are terminals (ttys). Other‐
  wise, the current selection is output if standard output is not a  ter‐
  minal  (tty),  and the selection is set from standard input if standard
  input is not a terminal (tty). If any input or output options are given
  then the program behaves only in the requested mode.

Discussion