Tạo khối tmux cho đến khi chương trình hoàn thành


8

Tôi ấn tượng bởi các tính năng điều khiển từ xa của tmux:

tmux new-window -t p12346 'echo foo;sleep 10' 

Điều này tạo ra một cửa sổ mới trong phiên có tên p12346 và không in bất cứ thứ gì trên màn hình. Điều đó thật tuyệt. Nhưng làm thế nào tôi có thể nói với lệnh trên để đợi cho đến khi giấc ngủ kết thúc trước khi trở về? Tức là tôi muốn làm điều này tương tự nhưng phải mất 10 giây để thực thi:

time tmux new-window -t p12346 'echo foo;sleep 10' 

Lý lịch

Nếu điều này khả thi thì nó có thể trở thành một tính năng của GNU Parallel: Các công việc hiện đang chạy có thể được truy cập khi mỗi cửa sổ của chúng đi qua tmux, do đó bạn có thể theo dõi tiến trình của từng công việc trong thời gian thực.

Vì vậy, tmuxsẽ không được chạy ở nền trước: Người dùng sẽ cần phải đính kèm với nó.

Câu trả lời:


8

tmux 1.8 đã giới thiệu wait-forlệnh có thể giúp làm những gì bạn muốn:

time tmux new-window -t p12346 'echo foo;sleep 10;tmux wait-for -S p12346-neww-done' \; \
          wait-for p12346-neww-done

Tên kênh của kênh (tên p12346-neww-donetrong ví dụ ở trên) có thể là bất cứ thứ gì bạn thích (miễn là giống nhau ở cả hai nơi; nếu bạn dự đoán nhiều lệnh gọi đồng thời có khả năng, thì có lẽ bạn cũng sẽ muốn sử dụng một giá trị duy nhất cho mỗi lần gọi ). Phần quan trọng là bạn đã chờ đợi tín hiệu của hồi giáo sau khi có new-windowlệnh (như là một phần của lệnh tmux tương tự , do đó dấu chấm phẩy đã thoát: tmux cần xử lý nó chứ không phải vỏ) và gửi tín hiệu là bước cuối cùng của lệnh của cửa sổ.

Nếu bạn cần mạnh mẽ hơn một chút để chống lại chuỗi lệnh của mình bị hủy bỏ theo cách xấu xí hoặc bất tiện, thì bạn có thể thử sử dụng bẫy shell để gửi tín hiệu (sắp xếp lại một chút để dễ đọc (?)):

time \
tmux new-window -t p12346 '
       trap "tmux wait-for -S p12346-neww-done" 0
       echo foo
       sleep 10
       ' \; wait-for p12346-neww-done
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.