
백그라운드에서 실행되는 프로세스(일부 파일을 생성하는 프로그램)의 실행을 병렬화하고 for 루프의 모든 명령이 완료되면 추가 명령이 실행되는 스크립트를 작성하려고 합니다. 생성된 명령) 파일을 다른 폴더에 저장하세요. 이것이 내가 지금까지 온 것입니다:
#!/bin/bash
for f in ./lqns/*.lqn
do
java -jar DiffLQN.jar $f &
done
mv ./lqns/*.csv csvs
병렬 처리는 작동하지만 회선에 도착하지 않으며 mv
터미널은 기다렸다가 반환되지 않습니다. 왜 돌아오지 않나요? 어떻게 해결할 수 있나요?
문제는 &
결승전에 있는 게 아닐까? 다른 명령을 기다리지만 더 이상 기다리지 않기 때문에? 라인 을 추가해도 mv
문제가 해결될 것 같습니다...
답변1
csv 파일이 java 명령에 의해 생성된 경우 mv
파일이 생성되기 전에 실행되므로 이 작업은 실패합니다. 모든 Java 프로세스가 백그라운드로 전송되므로 루프가 거의 즉시 완료되므로 스크립트는 계속 실행되고 mv
이동할 파일을 찾지 못하므로 아무 작업도 수행하지 않습니다.
간단한 해결책은 wait
.from help wait
(bash 쉘에서)을 사용하는 것입니다.
$ help wait
wait: wait [-fn] [-p var] [id ...]
Wait for job completion and return exit status.
Waits for each process identified by an ID, which may be a process ID or a
job specification, and reports its termination status. If ID is not
given, waits for all currently active child processes, and the return
status is zero. If ID is a job specification, waits for all processes
in that job's pipeline.
여기서 관련 비트는 "ID가 제공되지 않으면 현재 활성화된 모든 하위 프로세스를 기다립니다"입니다. 즉 wait
, 루프 뒤에 추가하여 계속하기 전에 모든 하위 프로세스가 완료될 때까지 스크립트를 기다리게 할 수 있음을 의미합니다.
#!/bin/bash
for f in ./lqns/*.lqn
do
java -jar DiffLQN.jar "$f" &
done
wait
mv ./lqns/*.csv csvs
또는 다음과 java
같은 mv
명령을 결합할 수 있습니다.
#!/bin/bash
for f in ./lqns/*.lqn
do
java -jar DiffLQN.jar "$f" && mv /lqns/*.csv csvs &
done
parallel
아마도 더 나은 또 다른 옵션 은 이러한 종류의 작업을 위해 특별히 설계된 도구인 GNU(실행 중인 운영 체제의 저장소에 있어야 함)를 사용하는 것입니다 . 그것으로 당신은 할 수 있습니다:
parallel java -jar DiffLQN.jar ::: ./lqns/*.lqn
mv ./lqns/*.csv csvs