I am doing quite a lot of work inside tmux. I especially love that I can start multiple windows/panes and use them to run the same thing across multiple servers, while still having normal shell access between steps.
This thing was greatly improved when I wrote tmux_send_to_many, but one thing was missing – waiting for the thing, running in tmux window to end.
Generally, I had to look at all the windows, and decide when to launch next step on my own.
Not anymore.
New script tmux_wait_for_many solves this problem (at least for me).
For example, let's assume that I run:
=$ tmux =$ for t in test{1..3}; do tmux new-window -d -n $t; done =$ tmux_send_to_many test 'sleep $(( RANDOM % 10 ))' Enter
and now, I'd like to launch something when all of these sleeps will end.
I can do it now trivially by running:
=$ tmux_wait_for_many test '^=\$[[:space:]]*$'
Like previously there are some options:
Syntax: tmux_wait_for_many [-a] [-f] [-l] [-v] [-s SKIP_MATCHER] [-w WAIT_TIME] PANE_MATCHER LINE_MATCHER Description: Waits for line matching given regexp to appear in tmux pane(s). This is useful, for example, for checking whether command running in pane ended. Options: -a : Enables matching across all sessions, not only current. -f : Match line in any place on screen, not only last non-empty. -l : List all matching panes and exit, don't wait on anything. -s : Skip lines that match this regular expression (egrep style). -w : Wait given time between checks of terminal, defaults to 1 (second). -v : Print verbose information while working. Arguments: PANE_MATCHER : Regular expression (compatible with egrep), that will be used to select panes that should be processed. Without -a, panes are listed only from current session, and have format: WINDOW_NAME.PANE_INDEX With -a, panes are listed from all sessions, and have format: SESSION_NAME:WINDOW_NAME.PANE_INDEX LINE_MATCHER : Regular expression (compatible with egrep), that will be used to check if last non-empty line in pane(s) contain what was expected. In case -f was provided, the whole screen (visible part) will be checked.
and verbose mode to show you what's happening:
=$ tmux_send_to_many test 'sleep $(( RANDOM % 10 ))' Enter; time tmux_wait_for_many -v test '^=\$[[:space:]]*$' Current tmux session: 1 Waiting for line matching: >>^=\$[[:space:]]*$<< in the last line of: test1.0:.+, test2.0:.....+, test3.0:...+ real 0m9.166s user 0m0.104s sys 0m0.079s
Not sure if you'll find it useful, but it is for me 🙂