กระบวนการแยกและตัวแปรที่แชร์


1

ฉันมีสคริปต์ทุบตีที่มีฟังก์ชั่นสองทางแยกทั้งหมดเขียนลงในบันทึก เมื่อทั้งคู่เสร็จสิ้นแล้วฉันต้องการลบบันทึกนี้

ปัญหาที่ฉันมีอยู่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 &

ตัวแปรคือ processFinishCount แต่คำสั่ง if มี processCount
jaychris

ตัวแปรโกลบอลยังเป็น 0 เมื่อเกิดส้อมขึ้น ดังนั้นกระบวนการที่แยกกันจะเริ่มต้นด้วย 0 และจะเพิ่มขึ้นเป็น 1 ทางออกหนึ่งคือการนับในไฟล์หรือมีไฟล์สถานะสำหรับแต่ละกระบวนการแยกและทดสอบการมีอยู่ของมัน
jaychris

@ Jaychris ความแตกต่างของตัวแปรเป็นเพียงการพิมพ์ผิด <br/> นั่นคือสิ่งที่ฉันได้สรุปแล้วเกิดขึ้น ไฟล์ภายนอกเป็นโซลูชันที่ถูกต้อง ฉันจะลองดูเมื่อฉันกลับไปทำงานในวันจันทร์
James Webster

คำตอบ:


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เพื่อรอให้กระบวนการลูกทั้งหมดเสร็จสิ้น พิมพ์นี้aหลังจาก 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.

ฉันไม่สามารถใช้การรอได้ความตั้งใจในการฟอร์กกิ้งในตอนแรกคือการเรียกใช้งานสคริปต์หลักให้เสร็จโดยเร็วที่สุด
James Webster

ใช่คุณสามารถ. วางการรอคอยในฟังก์ชั่นเชลล์ที่มีพื้นหลังแล้วจึงเรียกสองงาน จากนั้นคุณสามารถกลับมาจากสคริปต์หลักและ subshell กำลังรออยู่
Alan Shutko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.