2013-06-25 4 views
1

Если я запускаю скрипт с ./test.sh 100, я не получаю вывод 100, потому что я использую поток. Что мне нужно сделать, чтобы получить ожидаемый результат? (Я не должен менять test.sh хотя.)неправильный вывод из-за фоновых процессов

test.sh

#!/bin/bash 
FILE="number.txt" 
echo "0" > $FILE 
for ((x=1; x<=$1; x++)); do 
    exec "./increment.sh" $FILE & 
done 
wait 
cat $FILE 

increment.sh

#!/bin/bash 
value=(< "$1") 
let value++ 
echo $value > "$1" 

EDIT

Ну я попытался это:

#!/bin/bash 
flock $1 --shared 2>/dev/null 
value=(< "$1") 
let value++ 
echo $value > "$1" 

Теперь я получаю s omething like 98 99 все время, если я использую ./test.sh 100 Я не очень хорошо работаю, и я не знаю, как это исправить.

+2

Возможно, вы путаете темы и процессы. Bash запускает только внешние процессы, а не потоки. Оба они могут использоваться для параллелизма, но с разными последствиями. – zneak

+0

Что вы должны изменить, чтобы обеспечить последовательную работу набора асинхронных потоков? ... Небеса и Земля. – gbtimmon

+1

..start "поиск и устранение неисправностей" с человеком 7 встроенных страниц. ==> exec [-cl] [-a name] [command [arguments]] Если задана команда, она заменяет оболочку. Новый процесс не создается. Аргументами являются аргументы команды. Если задана опция -l, оболочка помещает тире в начале нулевого аргумента, переданного команде. Это то, что делает логин (1). Параметр -c заставляет команду запускаться с пустой средой. [...] <=== –

ответ

2

Если test.sh действительно не может быть улучшено, то каждый экземпляр increment.sh должен сериализовать свой собственный доступ к файлу $ FILE.

Блокировка файловой системы является очевидным решением для этого под UNIX. Однако для этого не существует оболочки. Вместо этого вы должны полагаться на внешнюю полезную программу, такую ​​как flock, setlock, или chpst -l|-L. Например:

#!/bin/bash 
(
    flock 100   # Lock *exclusively* (not shared) 
    value=(< "$1") 
    let value++ 
    echo $value > "$1" 
) 100>>"$1"   # A note of caution 

Предостережения: с помощью файла вы будете изменяющими как файл блокировка становится сложнее быстро - это легко укоротить в скорлупе, когда вы не значите, и смешивание режимов доступа выше может оскорбить некоторых людей, но вышеперечисленное позволяет избежать грубых ошибок.

+0

@ j0kR, обновленный ответ – pilcrow

+0

Большое спасибо. Это отлично работает. – j0kR