`apt-get install 'ทำอะไรในทางที่รอการเชื่อมต่ออินเทอร์เน็ต


1

ฉันมีปัญหาแปลก ๆ จริงๆ ฉันขยายการติดตั้งระบบปฏิบัติการสำหรับราสเบอร์รี่ Pi ฉันกำหนดค่าให้บูตอัตโนมัติหลังจากที่ตัวติดตั้งทำสิ่งต่าง ๆ และรันสคริปต์ของฉันซึ่งติดตั้งที่เหลืออยู่ แต่บางครั้งฉันต้องการติดตั้งส่วนเพิ่มเติมของฉันใหม่โดยไม่ต้องติดตั้งทั้งระบบปฏิบัติการใหม่ ดังนั้นฉันจึงมีสคริปต์ที่เรียกว่าon-first-login.shพร้อมสิ่งนี้:

if [ $(command -v git) ]; then
    echo "Git already installed."
else
    apt-get install git -y
fi

git clone git@github.com:me/my-repo.git ~/my-repo

ตอนนี้เป็นส่วนที่แปลกจริง ๆ ด้านบนใช้งานได้เมื่อจำเป็นต้องติดตั้ง git เท่านั้นหรือหากฉันเปลี่ยนสคริปต์เป็นสิ่งนี้:

apt-get install git -y

git clone git@github.com:me/my-repo.git ~/my-repo

มิฉะนั้นฉันจะได้รับข้อผิดพลาดนี้:

ssh: ไม่สามารถแก้ไขชื่อโฮสต์ github.com: ไม่ทราบชื่อหรือบริการ

ฉันต้องการแก้ปัญหานี้โดยหลักแล้วจะต้องหลีกเลี่ยงการโทรapt-get install git -yเพราะใช้เวลาประมาณ 5 วินาที (หากติดตั้ง git ไปแล้ว) ซึ่งค่อนข้างเจ็บปวด

ฉันพยายามทำให้สคริปต์รอ ping ที่ประสบความสำเร็จเช่นนั้น:

if [ $(command -v git) ]; then
    echo "Git already installed."
else
    apt-get install git -y
fi

pingerr=1
while [ $pingerr ]; do
    sleep 1
    ping -c 1 github.com | grep "1 received"
    pingerr=$?
    if [ $pingerr ]; then
      echo "Could not ping github. Retrying..."
    else
      echo "Successfully pinged github"
    fi
done

git clone git@github.com:me/my-repo.git ~/my-repo

แต่มันลองใหม่เรื่อย ๆ

เกิดอะไรขึ้นบนโลกนี้? ดูเหมือนapt-get installจะทำสิ่งที่พิเศษและฉันชอบที่จะรู้ว่าสิ่งที่

คำตอบ:


2

เมื่อคุณทราบแล้วคุณgit cloneจะได้รับสายก่อนที่การเชื่อมต่อเครือข่ายของคุณจะเต็ม ความมหัศจรรย์เพียงอย่างเดียวที่apt-getอาจเป็นไปได้คือใช้เวลาสักครู่ในการสืบค้นฐานข้อมูลแพ็คเกจท้องถิ่น นี่เป็นการให้เวลาเครือข่ายเพียงพอที่จะเปิดใช้งานและกำหนดค่า

สาเหตุที่สคริปต์ที่สองของคุณทำงานไม่ถูกต้องเป็นเพราะคุณสับสนรหัสที่ส่งคืนของโปรแกรม ใน bash หรือเชลล์โดยทั่วไปจำนวนศูนย์หมายถึงค่าบูลีน TRUE โปรแกรมที่ออกเรียบร้อยแล้วควรส่งคืนหมายเลขศูนย์ ดังนั้นถ้า ping (และ grep) ของคุณสำเร็จคุณจะได้รับค่าตอบแทนเป็นศูนย์และwhile 0จะวนซ้ำตลอดไป

ยิ่งไปกว่านั้นคุณกำลังคว้าค่าตอบแทนของคำสั่ง grep แทนที่จะใช้ ping โดยตรง ลองใช้สคริปต์นี้แทน:

retries=0
while ! ping -c1 github.com >/dev/null 2>&1; do
    sleep 1
    if (( retries++ > 10 )); then
        echo "Max retries reached, aborting." >&2
        exit 1
    fi
done

git clone git@github.com:me/my-repo.git ~/my-repo

หากต้องการเพิ่มรายละเอียดให้ลบการเปลี่ยนเส้นทางออกจาก ping

ฉันเดาว่านี่เป็นคำเตือนที่ชัดเจน แต่ความปลอดภัยของการตั้งค่าของคุณดูน่าสงสัย - คุณกำลังดาวน์โหลดสิ่งต่าง ๆ จากคอมไพล์ด้วยบัญชี root ...


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