1

У меня есть скрипт bash с двумя разветвленными функциями, все записи в журнал. Когда оба закончат, я хотел бы удалить этот журнал.

Однако у меня проблема в том, что processFinishCount никогда не бывает больше единицы. Собирает ли каждый разветвленный процесс копию общей переменной и увеличивает ее при delete_log?

Как я могу убедиться, что переменная увеличена правильно?

processFinishCount=0

delete_log()
{
    let processFinishCount++
    if ["$processFinishCount" == 2]; then
        rm log.txt

    else
        echo `$processFinishCount task(s) finished" >> log.txt
    fi
}

function_one()
{
    ...
    delete_log
}
function_two()
{
    ...
    delete_log
}

function_one &
function_two &

2 ответа2

0

Глобальная переменная в одном процессе не будет обновлена в другом. Следовательно, внешний файл может быть использован. У меня будет что-то вроде этого (не проверено на точность).

delete_log()
{
    touch /tmp/$1
    if [ -e $status_file1 -a -e $status_file2 ]
    then 
        rm log.txt
    else
        echo log >> log.txt
    fi
}

f1()
{
    ...
    delete_log $1
}

f2()
{
    ...
    delete_log $1
}

f1 fork1.done &
f2 fork2.done &
-1

Вы можете использовать wait чтобы дождаться завершения всех дочерних процессов. Это печатает через 3 секунды:

sleep 3 &
sleep 1 &
wait
echo a

help wait:

wait: wait [id]
    Wait for job completion and return exit status.

    Waits for the process identified by 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 a job specification, waits for all processes
    in the job's pipeline.

    Exit Status:
    Returns the status of ID; fails if ID is invalid or an invalid option is
    given.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .