ใครบางคนสามารถแสดงให้ฉันเห็นวิธีการทำโปรแกรมให้ทำสิ่งนี้: หลังจาก 5 นาที
echo "80" > /sys/class/leds/blue/brightness
ฉันต้องการให้โปรแกรมนี้ทำงานในพื้นหลัง (เช่นrngd
บริการ) ฉันไม่สามารถทำสิ่งนี้ได้เพราะฉันไม่รู้จัก Linux มากนัก
ใครบางคนสามารถแสดงให้ฉันเห็นวิธีการทำโปรแกรมให้ทำสิ่งนี้: หลังจาก 5 นาที
echo "80" > /sys/class/leds/blue/brightness
ฉันต้องการให้โปรแกรมนี้ทำงานในพื้นหลัง (เช่นrngd
บริการ) ฉันไม่สามารถทำสิ่งนี้ได้เพราะฉันไม่รู้จัก Linux มากนัก
คำตอบ:
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
ด้วยวิธีนี้สคริปต์ของคุณจะดำเนินต่อไปหรือคุณกู้คืนการควบคุมทันทีในขณะที่งานพื้นหลังใหม่ของสคริปต์เริ่มต้นขึ้นโดยมีสองคำสั่ง: sleep และ echo
ข้อผิดพลาดที่พบบ่อยคือการพยายามที่จะให้อย่างใดอย่างหนึ่งsleep
หรือecho
หรือทั้งสองอย่าง&
ที่จะไม่ทำงานตามที่ตั้งใจไว้ การเปิดตัวชุดคำสั่ง()
แม้ว่าจะวางไข่ในกระบวนการเชลล์แยกต่างหากซึ่งคุณสามารถส่งทั้งหมดเป็นพื้นหลัง&
ได้
เพื่อปัญญาที่ฉันพบว่ามันมีประโยชน์อย่างแข็งขัน ในอุปกรณ์แบบฝังตัวฉันพัฒนาขึ้นมีแอพพลิเคชั่นหลักที่ทำงานกับสุนัขเฝ้าบ้าน หากมันล้มเหลวในวิธีที่ทริกเกอร์การเฝ้าระวังการรีเซ็ตในไม่ช้าหลังจากการเริ่มต้นซ้ำ ๆ มันยากที่จะแก้ไขจากระยะไกลเป็นช่วงเวลาระหว่างการเริ่มระบบปฏิบัติการและการรีเซ็ตค่อนข้างสั้นไม่เพียงพอที่จะ ssh และบล็อกการเริ่มต้นแอป ดังนั้นฉันจึงต้องการวิธีตรวจสอบว่าระบบรีสตาร์ทอย่างรวดเร็วและแนะนำการหน่วงเวลาถ้าทำได้เพื่อให้เวลาตัวเองในการแก้ไขด้วยตนเอง
[ -f /tmp/startdelay ] && sleep 30
touch /tmp/startdelay
( sleep 30 ; rm /tmp/startdelay ) &
[ -f /tmp/noautostart ] && exit 0
start_app
หากฉันลงชื่อเข้าใช้และดำเนินtouch /tmp/noautostart
การแอพหลักจะไม่เริ่มทำงาน หากสุนัขเฝ้าบ้านเริ่มทำงานrm /tmp/startdelay
จะไม่ได้รับการดำเนินการและในครั้งต่อไปที่ระบบเริ่มต้นมันจะให้ 30 วินาทีพิเศษเพื่อหยุด มิฉะนั้นการรีสตาร์ทจะเป็นไปอย่างรวดเร็วโดยไม่ล่าช้า
&
เพื่อแบ็คกราวด์โหมดสลีป "คุณต้องทำให้พื้นหลังการนอนหลับเช่นกัน"อยู่ในบรรทัดแรกจากจุดเริ่มต้น หากคุณไม่เชื่อฉันให้ดูที่ประวัติการแก้ไข และคำตอบของฉันเก่ากว่าของคุณ 5 นาที: P
()
กลุ่มเชลล์ดั้งเดิมจะหยุดชั่วคราวจนกว่าจะวางไข่เสร็จหนึ่งอัน)
ใช้at
คำสั่ง
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
ที่จะทำงานในพื้นหลัง
echo
รวมกันโดยใช้ heredoc หรือ herestring
at
เป็นคำสั่ง POSIX มาตรฐาน สิ่งที่ระบบเหมือน Unix ไม่สามารถใช้ได้โดยค่าเริ่มต้น?
หากคุณต้องการให้บางสิ่งบางอย่างทำงานใน 5 นาที แต่ส่วนที่เหลือของโปรแกรมของคุณเพื่อดำเนินการต่อ (หรือเสร็จสิ้น) คุณต้องแบ็คกราวน์สลีปด้วย:
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
นี้จะพิมพ์hello
แล้ว 3 วินาทีต่อมา (หลังจากโปรแกรมหลักได้ออก) world
การพิมพ์
ส่วนที่สำคัญคือการ&
แยกการดำเนินการของฟังก์ชั่นเป็นพื้นหลัง
runWithDelay () { sleep $1; "${@:2}"; }
แทนได้ไหม
doWhateverWithDelay 3 &
ในตัวอย่างที่สองของคุณ
$@
คือคุณสามารถพูดและจะขยายออกเป็นรายการคำที่ยกมา ดังนั้นควรทำให้ดีขึ้น"$@"
(หรือ"${@}"
ถ้าคุณชอบเครื่องมือจัดฟัน) ดูpastebin.com/MU7hbB2C
-n
) แต่เห็นได้ชัดว่ามันไร้เดียงสา