Buat blok tmux sampai program selesai

8

Saya terkesan dengan fitur remote control tmux:

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

Ini menciptakan jendela baru di sesi bernama p12346 dan tidak mencetak apa pun di layar. Itu hebat. Tetapi bagaimana saya bisa mengatakan perintah di atas untuk menunggu sampai tidur selesai sebelum kembali? Yaitu saya ingin ini melakukan hal yang sama tetapi untuk mengambil 10 detik untuk mengeksekusi:

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

Latar Belakang

Jika ini layak maka itu mungkin menjadi fitur GNU Parallel: Pekerjaan yang sedang berjalan dapat diakses setiap kali melalui jendela mereka tmux, sehingga Anda dapat mengikuti kemajuan setiap pekerjaan secara real time.

Jadi tmuxtidak akan dijalankan di latar depan: Pengguna harus melampirkannya.

Ole Tange
sumber

Jawaban:

8

tmux 1.8 memperkenalkan wait-forperintah yang dapat membantu melakukan apa yang Anda inginkan:

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

Nama "saluran" ( p12346-neww-donedalam contoh di atas) dapat berupa apa saja yang Anda suka (asalkan sama di kedua tempat; jika Anda mengantisipasi beberapa pemanggilan serentak yang berpotensi simultan, maka Anda mungkin juga ingin menggunakan nilai unik untuk setiap pemanggilan ). Bagian yang penting adalah bahwa Anda "menunggu" sinyal setelah new-windowperintah (sebagai bagian dari perintah tmux yang sama , sehingga titik koma lolos: tmux perlu memprosesnya, bukan shell) dan mengirim sinyal sebagai langkah terakhir dari perintah jendela.

Jika Anda perlu sedikit lebih kuat terhadap urutan perintah Anda yang dibatalkan dengan cara yang jelek atau tidak nyaman, maka Anda dapat mencoba menggunakan shell trap untuk mengirim sinyal (mengatur ulang sedikit agar mudah dibaca (?)):

time \
tmux new-window -t p12346 '
       trap "tmux wait-for -S p12346-neww-done" 0
       echo foo
       sleep 10
       ' \; wait-for p12346-neww-done
Chris Johnsen
sumber