프로그램이 완료될 때까지 tmux 블록을 만듭니다.

프로그램이 완료될 때까지 tmux 블록을 만듭니다.

저는 tmux의 원격 제어 기능에 매우 감동받았습니다.

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

그러면 p12346이라는 세션에 새 창이 생성되고 화면에 아무것도 인쇄되지 않습니다. 기이. 하지만 위 명령에 수면이 완료될 때까지 기다렸다가 돌아오라고 지시하려면 어떻게 해야 합니까? 즉, 동일한 작업을 수행하고 싶지만 수행하는 데 10초가 걸립니다.

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

배경

이것이 작동한다면 GNU Parallel의 기능이 될 수 있습니다. 현재 실행 중인 작업은 각 창을 통해 액세스할 수 있으므로 tmux각 작업의 진행 상황을 실시간으로 추적할 수 있습니다.

따라서 tmux포그라운드에서는 실행되지 않습니다. 사용자가 여기에 연결되어야 합니다.

답변1

멀티플렉서1.8에는 wait-for원하는 작업을 수행하는 데 도움이 되는 명령이 도입되었습니다.

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

"채널" 이름( p12346-neww-done위 예에서)은 원하는 대로 지정할 수 있습니다(두 위치에서 동일하다면). 여러 호출이 동시에 이루어질 것으로 예상되는 경우 고유한 이름을 사용할 수도 있습니다. 각 통화 값에 대해). 중요한 것은 new-window(동일한 명령의 일부로) 명령 다음에 신호를 "기다린다"는 것입니다.멀티플렉서명령을 실행하므로 세미콜론을 피하십시오.멀티플렉서쉘이 아닌 처리해야 함) 창 명령의 마지막 단계로 신호를 보냅니다.

추악하거나 불편한 방식으로 명령 시퀀스를 중단하는 것에 대해 더 강력해야 하는 경우 쉘 트랩을 사용하여 신호를 보낼 수 있습니다(가독성을 위해 비트(?)를 재정렬함).

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

답변2

다음 대안이 더 적합할 수 있습니다.

tmux 외부:

mkfifo fifo && tmux new -d '(echo foo;sleep 3) 9> fifo' && time cat fifo

tmux 내부:

mkfifo fifo && tmux new-window '(echo foo;sleep 10) 9> fifo' && cat fifo 

한 가지 차이점 wait-for은 이 방법은 데드맨 스위치처럼 작동한다는 것입니다. wait-for -S어떤 이유로 명령이 실행되지 않더라도 작동합니다.

또 다른 차이점은 기본 프로세스의 모든 하위 프로세스가 종료될 때까지 기다린다는 것입니다(백그라운드에 자신을 두려는 프로그램에서 일반적으로 다른 파일 설명자를 명시적으로 닫지 않는 한).

설명: 이 cat명령은 FIFO의 다른 쪽 끝이 열릴 때까지 기다렸다가 종료됩니다.모두파일 설명자의 인스턴스가 닫히는데, 이는 파일 설명자를 보유한 모든 프로세스가 종료될 때 발생합니다. 파일 설명자의 속성으로 인해 이 효과는 기본적으로 상위 프로세스의 열린 파일 설명자를 상속하는 하위 프로세스로 전파됩니다.

관련 정보