วิธีการเรียกใช้คำสั่งในพื้นหลังล่าช้า?


33

ใครบางคนสามารถแสดงให้ฉันเห็นวิธีการทำโปรแกรมให้ทำสิ่งนี้: หลังจาก 5 นาที

echo "80" > /sys/class/leds/blue/brightness

ฉันต้องการให้โปรแกรมนี้ทำงานในพื้นหลัง (เช่นrngdบริการ) ฉันไม่สามารถทำสิ่งนี้ได้เพราะฉันไม่รู้จัก Linux มากนัก

คำตอบ:


51
( 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 วินาทีพิเศษเพื่อหยุด มิฉะนั้นการรีสตาร์ทจะเป็นไปอย่างรวดเร็วโดยไม่ล่าช้า


ใช่ฉันเห็นด้วย แต่นั่นอาจเป็นส่วนหนึ่งของการสะท้อนผู้ใช้ ;-)
Kiwy

คำตอบอื่น ๆ ดูเหมือนจะพลาดส่วน "เบื้องหลัง" ไม่ฉันค่อนข้างชัดเจนเกี่ยวกับเรื่องนั้น: /
goldilocks

@goldilocks: คุณเพิ่มส่วนที่ส่งเป็นพื้นหลังเฉพาะหลังจากที่ฉันโพสต์คำตอบของฉัน
เอสเอฟ

ไม่คำตอบดั้งเดิมของฉันคือเรียกใช้ฟังก์ชันที่มีโหมดสลีป&เพื่อแบ็คกราวด์โหมดสลีป "คุณต้องทำให้พื้นหลังการนอนหลับเช่นกัน"อยู่ในบรรทัดแรกจากจุดเริ่มต้น หากคุณไม่เชื่อฉันให้ดูที่ประวัติการแก้ไข และคำตอบของฉันเก่ากว่าของคุณ 5 นาที: P
goldilocks

1
@gekannt: ... เอ่อคำถามคือ "วิธีการเรียกใช้คำสั่งในพื้นหลังด้วยความล่าช้าหรือไม่" - คุณจะประสบความสำเร็จได้อย่างไร? (และไม่ถ้าคุณไม่ทำแบ็คกราวน์()กลุ่มเชลล์ดั้งเดิมจะหยุดชั่วคราวจนกว่าจะวางไข่เสร็จหนึ่งอัน)
SF

11

ใช้atคำสั่ง

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

ที่จะทำงานในพื้นหลัง


2
นี่เป็นวิธีที่ถูกต้อง แต่ต้องใช้ atd daemon ในการทำงานและในระบบส่วนใหญ่จะต้องติดตั้งแพ็กเกจ
Julian

คุณสามารถใช้เครื่องหมายคำพูดเดี่ยวเพื่อหลีกเลี่ยงการหลบหนีและนำมาechoรวมกันโดยใช้ heredoc หรือ herestring
Chris Down

@Julian atเป็นคำสั่ง POSIX มาตรฐาน สิ่งที่ระบบเหมือน Unix ไม่สามารถใช้ได้โดยค่าเริ่มต้น?
Stéphane Chazelas

1
@ StéphaneChazelas - คำถามที่ดี ฉันรู้ว่าฉันมีปัญหานี้ แต่เมื่อไม่นานมานี้ ฉันทำการตรวจสอบเล็กน้อยและคำสั่ง at ดูค่อนข้างแพร่หลาย นอกจากนี้ดูเหมือนว่า atd นั้นเป็น Linux โดยเฉพาะและแม้กระทั่งในระบบ Linux บางระบบอาจถูกแทนที่ด้วย BSD style cron daemon ลองพิจารณาความคิดเห็นของฉันล้าสมัย
Julian

ฉันลอง 'at' และไม่พบคำสั่งบน Android 8
beppe9000

6

หากคุณต้องการให้บางสิ่งบางอย่างทำงานใน 5 นาที แต่ส่วนที่เหลือของโปรแกรมของคุณเพื่อดำเนินการต่อ (หรือเสร็จสิ้น) คุณต้องแบ็คกราวน์สลีปด้วย:

#!/bin/bash

runWithDelay () {
    sleep $1;
    shift;
    "${@}";
}

runWithDelay 3 echo world &
echo hello    

นี้จะพิมพ์helloแล้ว 3 วินาทีต่อมา (หลังจากโปรแกรมหลักได้ออก) worldการพิมพ์

ส่วนที่สำคัญคือการ&แยกการดำเนินการของฟังก์ชั่นเป็นพื้นหลัง


1
ฉันขอแนะนำrunWithDelay () { sleep $1; "${@:2}"; }แทนได้ไหม
จัดการ

1
ฉันคิดว่ามันควรอ่านdoWhateverWithDelay 3 &ในตัวอย่างที่สองของคุณ
Baarn

@ การทำงาน: ไชโย
goldilocks

1
@goldilocks สิ่งสำคัญในการใช้$@คือคุณสามารถพูดและจะขยายออกเป็นรายการคำที่ยกมา ดังนั้นควรทำให้ดีขึ้น"$@"(หรือ"${@}"ถ้าคุณชอบเครื่องมือจัดฟัน) ดูpastebin.com/MU7hbB2C
จัดการ

@ การทำงาน: นำจุด;) ฉันลองใช้ args กับ echo ( -n) แต่เห็นได้ชัดว่ามันไร้เดียงสา
goldilocks
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.