2017-05-15 8 views
2

두 개의 Linux 명령을 실행해야 각 출력이 종료되지 않고 계속 stdout으로 출력됩니다 (I Ctrl-C까지).포 그라운드에서 두 개의 Linux 명령을 실행하고 표준 출력을 병합 할 수 있습니까?

2 개의 별도 터미널에서 2 개의 명령을 아무런 문제없이 실행할 수 있습니다.

그러나 한 터미널에서 하나의 명령을 실행하여 위의 두 명령을 모두 포 그라운드에서 실행하고 표준 출력을 공유하도록 할 수 있습니까?

답변

4

GNU 병렬으로 표현하고 제어 할 수 있습니다. 반복적으로 출력되고 멈추지 않는 2 개의 더미 프로세스 인 f1f2을 생성한다고 가정 해 보겠습니다. 그들은 다음과 같습니다

F1

#!/bin/bash 
while :; do 
    echo 1,$RANDOM 
    sleep 2 
done 

F2 이제

#!/bin/bash 
while :; do 
    echo 2,$RANDOM 
    sleep 2 
done 

한 번에 모두를 시작할 수 있습니다 (분명히 - 그것은 GNU라는 이유없이 병렬 아니에요) 이렇게 :

parallel --line-buffer ::: ./f1 ./f2 
1,17387 
2,1457 
2,32743 
1,15684 
... 
... 
,

또는, 당신은 프로세스 이름 태그 출력의 라인을 원한다면, 당신은이 작업을 수행 할 수 있습니다

parallel --line-buffer --tag ::: ./f[12] 
./f1 1,11877 
./f2 2,28716 
./f2 2,7683 
./f1 1,23392 
... 
... 

당신은 제어-C 과정, 그들은 모두 정지됩니다 - 당신은 변경할 수 있지만 당신 경우 wish - --halt을 맨페이지에서 검색하십시오.

+0

이 사실을 알지 못했습니다. 그것을 사랑해! 나는 이것이 내장 된 것이 었으면 좋겠다. 감사! –

+1

** GNU Parallel **은 안타깝게도 광고가 미흡하고 사용량이 적습니다. 해마다 CPU 주파수가 증가하고 멀티 코어 시대가 시작되면서 앞으로 나아갈 길은 IMHO입니다. 프로젝트에 행운을 빌어 요! –

0

사용 중괄호 :

{ command1; command2; } > output 

당신은 표준 출력과 표준 에러 모두 재 지정하려면 :

{ command1; command2; } &> output 
+1

이렇게하면 command1이 완료 될 때까지 command2가 실행되지 않습니다. 그러나 OP는 명령이 모두 종료 될 때까지 종료되지 않으며 의도가 둘 다 병렬로 실행된다는 것을 분명히합니다. – rici

2

당신은 배경에 첫 번째 그들이를 공유 전경에서 두 번째 하나를 실행 할 수 있습니다 stdout. Ctrl-C을 사용하면 2 번째 것을 멈출 수 있고 1 번째를 멈추고 싶다면 그 직업을 죽여야합니다. 보도 fg

cmd1 & cmd2 

당신이 & 대신 ;를 사용하는 경우 믹스 출력 파일 다음

cmd1>file & cmd2>file 

을 원한다면 Ctrl-C, 두 번째 명령은 시작은 1 차 마감 당신은 더 원할 것입니다 경우 때 읽을 수있는 출력.

동일한 터미널에서 실행하고 함께 중지 할 수 있는지 확실하지 않습니다. 아마도 스크립트 나 비슷한 것을 사용하고있을 것입니다.

+0

'stdbuf'명령을 사용하여 출력 라인을 병합 할 수 있습니다. – hek2mgl

+0

감사합니다, Nicolas. 이것은 실제로 사용자가 백그라운드 프로세스를 처리해야한다는 것을 제외하고는 나쁜 옵션이 아닙니다. –