프로그램이 완료될 때까지 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의 다른 쪽 끝이 열릴 때까지 기다렸다가 다음이 열릴 때 종료됩니다.모두해당 파일 설명자의 인스턴스는 닫힙니다. 이는 해당 파일 설명자를 보유한 모든 프로세스가 종료될 때 발생합니다. 기본적으로 하위 프로세스가 상위 프로세스의 열린 파일 설명자를 상속하는 파일 설명자의 속성 덕분에 이 효과는 하위 프로세스로 전파됩니다.

관련 정보