문제

나는 실행하려고 어떤 명령에 paralel,에서 배경,사 bash.여기에 내가 무엇을 하려고:

forloop {
  //this part is actually written in perl
  //call command sequence
  print `touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;`;
}

일부 사 backticks(`)새로운 쉘 명령을 실행됩니다.는 것은,제어 원래 프로그램만 반환한 후에 마지막 명령을 실행되었다.고 싶을 실행하는 전체 문서를 배경(난 기대하지 않는 모든 출력/반환값)고 싶다는 것입니다 루프를 계속 실행합니다.

호출 프로그램(으로 한 반복)이 끝나지 않을 때까지 모든 양산 껍질을 마무리합니다.

사용할 수 있는 스레드에서 펄 산란 다른 스레드는 호출의 다른 포탄,하지만 그것 보다는 잔인...

시작할 수 있는 포탄,그것에게 명령하고 그것을 말해 이동합니다.

도움이 되었습니까?

해결책

I 테스트하지 않았습니다 이지만는 방법에 대

print `(touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;) &`;

괄호 안의 의미를 실행에만 해서는 안를 요청할 수 있습니다.

다른 팁

감사 Hugh,는 않았다:

adrianp@frost:~$ (echo "started"; sleep 15; echo "stopped")
started
stopped
adrianp@frost:~$ (echo "started"; sleep 15; echo "stopped") &
started
[1] 7101
adrianp@frost:~$ stopped

[1]+  Done                    ( echo "started"; sleep 15; echo "stopped" )
adrianp@frost:~$ 

다른 아이디어가 작동하지 않기 때문에 그들은 그 시작에서 각 명령을 배경,그리고 명령을 시퀀스(이 중요한 내 경우에!).

감사합니다.

또 다른 방법은 다음과 같은 구문을 사용:

{ command1; command2; command3; } &
wait

Note & 가 끝에서의 명령 그룹,후 각 명령입니다.세미콜론 최종 후 명령을 필요로하는 공간 후 첫 번째 부류하기 전에 최종괄합니다.이 wait 에서 끝나는 것을 보장 부모 프로세스는 죽기 전에 생성된 자식 프로세스(명령 그룹)에 종료됩니다.

할 수 있도 멋진 물건을 같이 리다이렉션 stderrstdout:

{ command1; command2; command3; } 2>&2 1>&1 &

귀하의 예는 다음과 같다:

forloop() {
    { touch .file1.lock; cp bigfile1 /destination; rm .file1.lock; } &
}
# ... do some other concurrent stuff
wait # wait for childs to end
for command in $commands
do
    "$command" &
done
wait

앰퍼샌드의 끝에서 명령을 실행에서 배경,그리고 wait 까지 기다리고 백그라운드 작업이 완료됩니다.

GavinCattell 어 가장 가까운(대 bash,IMO)지만,Mad_Ady 지적하지 않을 것이라고"lock"파일이 있습니다.이해야 한다:

이 있는 경우 다른 작업을 보류 중 기다릴 것입니다 사람들을 위해,too.필요하신 경우에는 기한 사본,당신이 축적될 수 있는 그 Pid 대만습니다.하지 않을 경우,삭제할 수 있습니다 3 라인과 함께"pid"하지만 그것이 더 많은 일반적이다.

또한 추가 검사를 방지하본부:

pids=
for file in bigfile*
do
    # Skip if file is not newer...
    targ=/destination/$(basename "${file}")
    [ "$targ" -nt "$file" ] && continue

    # Use a lock file:  ".fileN.lock" for each "bigfileN"
    lock=".${file##*/big}.lock"
    ( touch $lock; cp "$file" "$targ"; rm $lock ) &
    pids="$pids $!"
done
wait $pids

덧붙이자면,그것은 다음과 같이 당신에 복사하는 새로운 파일을 FTP 소(또는 이와 유사한).그렇다면,당신은 당신 을 고려한 복사/이름을 바꾸는 대신 전략의 잠금파일(하지만 다른 항목).

시설 bash 당신이 찾고있는 것이 불 Compound Commands.남자 페이지에 대한 더 많은 정보:

화합물 명령 화합물 명령은 다음 중 하나입니다:

   (list) list  is  executed  in a subshell environment (see COMMAND EXECUTION ENVIRONMENT below).  Variable assignments and
          builtin commands that affect the shell's environment do not remain in effect after  the  command  completes.   The
          return status is the exit status of list.

   { list; }
          list  is  simply  executed in the current shell environment.  list must be terminated with a newline or semicolon.
          This is known as a group command.  The return status is the exit status of list.  Note that unlike the metacharac‐
          ters  (  and  ),  {  and  } are reserved words and must occur where a reserved word is permitted to be recognized.
          Since they do not cause a word break, they must be separated from list by whitespace or another shell  metacharac‐
          ter.

다른 사람이 있지만,이들은 아마도 2 대부분의 일반적인 형식입니다.먼저,괄호,실행의 목록에 명령을 시리즈에 두 번째,중괄호,의 목록에 명령을 시리즈에서는 현재 쉘입니다.

괄호

% ( date; sleep 5; date; )
Sat Jan 26 06:52:46 EST 2013
Sat Jan 26 06:52:51 EST 2013

중괄호

% { date; sleep 5; date; }
Sat Jan 26 06:52:13 EST 2013
Sat Jan 26 06:52:18 EST 2013

실행 명령을 사용하여서는 일:

# date
# jue sep 13 12:43:21 CEST 2012
# at 12:45
warning: commands will be executed using /bin/sh
at> command1
at> command2
at> ...
at> CTRL-d
at> <EOT>
job 20 at Thu Sep 13 12:45:00 2012

결과가 될 것입니다 귀하의 계정으로 전송하여 주시기 바랍니다.

나는 우연히 이 스레드가 여기에 함께 넣어하기로 결정했 코드 조각 산란 체인 문을 배경으로 작업입니다.이에 강타한 리눅스,KSH IBM AIX 비지의 재로,그래서 안전하다고 생각하고 말 그것은 작품에서 본 같은 쉘입니다.

processes=0;
for X in `seq 0 10`; do
   let processes+=1;
   { { echo Job $processes; sleep 3; echo End of job $processes; } & };
   if [[ $processes -eq 5 ]]; then
      wait;
      processes=0;
   fi;
done;

이 코드는 실행의 번호를 바탕 작업이 특정 한도까지의 동시 작업입니다.당신이 사용할 수 있습니다,예를 들어,다시 압축하기 위해 많은 gzip 으로 압축한 파일 xz 지 않고의 거대한 무리 xz 프로세스를 먹는 전체 메모리고 컴퓨터를 던져:이 경우에,당신은 사용 *for목록 배치 작업 gzip -cd "$X" | xz -9c > "${X%.gz}.xz".

명령을 실행에:

(command1 ; command2 ; command3) &

려 넣어 명령 중괄호와&s,like this:

{command1 & ; command2 & ; command3 & ; }

이것이 만들어지지 않 sub-shell,하지만 실행하는 명령 그룹에서 배경입니다.

HTH

왜 아무도 대답으로 적절한 솔루션:

my @children;
for (...) {
    ...
    my $child = fork;
    exec "touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;" if $child == 0;
    push @children, $child;
}
# and if you want to wait for them to finish,
waitpid($_) for @children;

이로 인해 펄 산란 아이들이 각 명령을 실행할 수 있습니다 모든 아이들을 완료하기 전에 진행되고 있다.

방법으로,

print `some command`

system "some command"

출력 동일 내용을 표준출력으로 출력하지만,첫 번째는 오버헤드가 높으로,Perl 을 캡처의 모든"some command"의 출력

분기에 대한 반복:

for i in x; do ((a; b; c;)&); done

예제:

for i in 500 300 100; do ((printf "Start $i: "; date; dd if=/dev/zero of=testfile_$i bs=1m count=$i 2>/dev/null; printf "End $i: "; date;)&) && sleep 1; done

의 경우에는 누군가가 여전히이 관심이 있다면,당신은 그것을 할 수 있는 호출하지 않고는점이 존재한다.이와 같은:

print `touch .file1.lock && cp bigfile1 /destination && rm .file1.lock &`;

당신이 사용할 수 있는 GNU parallel 명령을 실행하는 작업을 병행합니다.그것이 더 안전하고 빠릅니다.

내 생각하려고 하는 사본을 여러 큰 파일에서 정보를 원하십니까?그리고 당신이 할 수 있는 병렬로 아래의 문입니다.

$ ls *|parallel -kj0 --eta 'cp {} /tmp/destination'

우리가 사용되는 -j0 옵션,모든 파일을 복사합니다.는 경우에 필요한 경우의 수를 줄이 병렬 프로세스할 수 있습니다 다음 사용 -j<n><n> 은 수의 병렬 프로세스를 실행할 수 있습니다.

병렬 또한 수집한 출력을 프로세스 및 보고서에서 순차적으로(과 -k 옵션)는 다른 작업을 제어 메커니즘을 할 수 없습니다.

--eta 옵션을 제공할 정보의 통계 프로세스는 것입니다.그래서 우리가 할 수 있는 방법을 알고 있습의 프로세스가 완료되었으며 얼마나 오래 걸릴 것입니다 얻을 완료됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top