다음 테스트 스크립트가 있습니다.
#!/bin/bash
function foo {
printf "Test line break: $1\nafter line break\n\n"
}
for VARIABLE in {1..30}
do
foo $VARIABLE &
done
wait
이제 스크립트를 여러 번 실행하고 때로는 출력이 다음과 같이 표시됩니다.
Test line break: 15
Test line break: 14
after line break: 14
after line break: 15
Test line break: 16
after line break: 16
예상 대신 :
Test line break: 15
after line break: 15
Test line break: 14
after line break: 14
Test line break: 16
after line break: 16
printf가 다른 printf를 "중단"하는 것을 방지하면서도 여전히 백그라운드에서 실행하는 방법은 무엇입니까?
나에게 문제는 printf의 "\n"인 것 같습니다.
답변1
실제로 뮤텍스가 필요합니다.
각 하위 쉘은 동일한 /dev/stdout
상위 쉘에 동시에 액세스하므로 동일한 기능 내에서도 순서가 보장되지 않습니다. 이를 보장하려면 상호 배제를 강제하는 잠금이 필요합니다. 즉, /dev/stdout
잠금이 해제될 때까지 다른 프로세스는 쓰기를 시작할 수 없습니다.
#!/bin/bash
function foo {
lockdir=/tmp/myscript.lock
mkdir "$lockdir" 2>/dev/null
while [ $? -ne 0 ]; do mkdir "$lockdir" 2>/dev/null; done
printf "Test line break: $1\nafter line break: $1\n\n"
rm -rf $lockdir
}
for VARIABLE in {1..30}
do
foo $VARIABLE &
done
wait
그러면 다음과 같은 결과가 나타납니다.
$ bash plop1 2>/dev/null
Test line break: 5
after line break: 5
Test line break: 3
after line break: 3
Test line break: 11
after line break: 11
Test line break: 23
after line break: 23
Test line break: 14
after line break: 14
Test line break: 17
after line break: 17
Test line break: 24
after line break: 24
Test line break: 21
after line break: 21
Test line break: 27
after line break: 27
Test line break: 6
after line break: 6
Test line break: 2
after line break: 2
Test line break: 9
after line break: 9
Test line break: 26
after line break: 26
Test line break: 29
after line break: 29
Test line break: 20
after line break: 20
Test line break: 1
after line break: 1
Test line break: 12
after line break: 12
Test line break: 4
after line break: 4
Test line break: 13
after line break: 13
Test line break: 10
after line break: 10
Test line break: 15
after line break: 15
Test line break: 28
after line break: 28
Test line break: 25
after line break: 25
Test line break: 19
after line break: 19
Test line break: 18
after line break: 18
Test line break: 8
after line break: 8
Test line break: 7
after line break: 7
Test line break: 16
after line break: 16
Test line break: 22
after line break: 22
Test line break: 30
after line break: 30