다양한 매개변수를 사용하여 Python 스크립트를 여러 번 실행하고 싶습니다. 이를 위해 다음 bash 스크립트를 작성했습니다.
requests=(25 50 75 100)
factors=(3 6)
graphsizes=(25 50 75)
for request in "${requests[@]}"; do
for factor in "${factors[@]}"; do
for size in "${graphsizes[@]}"; do
echo "Now Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out;
echo nohup python3 -u main.py "$request" 50 "$factor" "$size" > ${request}_${factor}_${size}.log &
echo "Done Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out;
done
done
done
;
echo
병렬로 실행되는 것을 원하지 않기 때문에 첫 번째와 마지막 끝에 추가했습니다 . 사실 저는 Python 스크립트에 대한 모든 호출이 main.py
병렬이 아닌 순차적으로 실행되기를 원합니다. 스크립트 자체가 이미 병렬화되어 있고 경쟁 조건이 필요하지 않기 때문입니다.
;
일반적으로 작업을 순서대로 실행하기 위해 a를 사용한다는 것을 알고 있지만 &
nohup 줄 다음에 이 작업을 수행하면 오류가 발생합니다.
syntax error near unexpected token `;'
루프의 각 반복을 순차적으로 실행하려면 어떻게 해야 합니까?
답변1
여러 줄로 스크립트를 작성한 방식에서는 ";"이 줄 바꿈 문자로 암시됩니다. 가장 안쪽 루프 내부의 세 줄 끝에 있는 ";"을 제거하면 for
스크립트가 순차적으로 실행됩니다. spec 과 do
같은 줄 에 항목을 넣을 때와 같이 항목 사이에 구분선이 있어야 하는 동일한 줄로 항목을 이동하는 경우에만 ';'이 필요합니다. for
아래 재작성된 스크립트의 대체 위치를 참고하세요 .do
for request in "${requests[@]}"
do
for factor in "${factors[@]}"
do
for size in "${graphsizes[@]}"
do
echo "Now Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out
echo nohup python3 -u main.py "$request" 50 "$factor" "$size" > ${request}_${factor}_${size}.log
echo "Done Running: n = ${request}, factor = ${factor}, size = ${size}" >> nohup.out
done
done
done
답변2
조합 수가 늘어나면 컴퓨터가 압도당하게 됩니다.
이것이 GNU Parallel이 유용한 곳입니다:
nohup parallel -j100% --header : python3 -u main.py {request} 50 {factor} {size} '>' {request}_{factor}_{size}.log \
::: request 25 50 75 100 \
::: factor 3 6 \
::: size 25 50 75
CPU 코어당 하나의 작업을 실행하지 않으려면 -j100%를 변경합니다.