ตัวอย่างเช่นเมื่อฉันพิมพ์ping 8.8.8.8 &
เหตุใดเราจึงเห็นกระบวนการปิงทำงาน และเมื่อฉันพิมพ์find / -name '*test*' &
ก็จะเห็นบนจอภาพ
ทำไมถึงเป็นอย่างนั้น? มันไม่ได้อยู่ในพื้นหลังจริงๆเหรอ?
ตัวอย่างเช่นเมื่อฉันพิมพ์ping 8.8.8.8 &
เหตุใดเราจึงเห็นกระบวนการปิงทำงาน และเมื่อฉันพิมพ์find / -name '*test*' &
ก็จะเห็นบนจอภาพ
ทำไมถึงเป็นอย่างนั้น? มันไม่ได้อยู่ในพื้นหลังจริงๆเหรอ?
คำตอบ:
&
นำเปลือกเพื่อเรียกใช้คำสั่งในพื้นหลังคือมันจะคดเคี้ยวและเรียกใช้ในการแยกย่อยเปลือกเป็นงานถ่ายทอดสด
โปรดทราบว่าเมื่อคุณใส่&
เอาท์พุท - ทั้งstdout และ stderr - จะยังคงถูกพิมพ์ลงบนหน้าจอ หากคุณไม่ต้องการที่จะเห็นผลใด ๆ บนหน้าจอเปลี่ยนเส้นทางทั้งสองstdout
และstderr
ไปยังแฟ้มโดย:
myscript > ~/myscript.log 2>&1 &
โดยปกติแล้วคุณอาจต้องการทิ้งstderr
โดยเปลี่ยนเส้นทางไปที่/dev/null
หากคุณไม่กังวลเกี่ยวกับการวิเคราะห์ข้อผิดพลาดในภายหลัง
นอกจากนี้คุณยังสามารถเรียกใช้คำสั่ง / สคริปต์ในเวลาเดียวกันในเชลล์ย่อยแยก สำหรับเช่น;
./script1 & ./script2 & ./script3 &
สามารถนำงานพื้นหลังกลับไปที่บรรทัดคำสั่งก่อนที่จะเสร็จสิ้นด้วยคำสั่ง:
fg <job-number>
job-number
สามารถรับได้โดยการเรียกใช้
jobs
2>&1
เปลี่ยนเส้นทางไปยังstderr
stdout
stty tostop
จะกล่าวถึงซึ่งจะทำให้งานแบ็คกราวน์ถูกระงับหากพวกเขาพยายามเขียนถึงเทอร์มินัล
เมื่อคุณใช้&
กระบวนการทำงานในพื้นหลัง แต่เอาต์พุตมาตรฐานยังคงเป็นเทอร์มินัล
ในความเป็นจริงคุณสามารถเรียกใช้ping 8.8.8.8 &
และfind / -name '*test*' &
ในเวลาเดียวกัน (ทำให้เกิดเอาต์พุตแบบผสม) แต่คุณไม่สามารถรันping 8.8.8.8
และfind / -name '*test*'
ในเวลาเดียวกันบนเชลล์เดียวกัน
ping 8.8.8.8 &> /dev/null &
หากคุณไม่ต้องการที่จะเห็นอะไรบางอย่างเช่นการใช้งาน
นอกจากนี้คุณอาจต้องการที่จะเรียนรู้เกี่ยวกับและnohup
disown
disown
ไม่ได้ป้องกันไม่ให้มีการพิมพ์เอาต์พุตไปยังเทอร์มินัล
/dev/null
เป็นไฟล์เพื่อเปลี่ยนเส้นทางเอาท์พุทขั้วถ้าใครต้องการที่จะทิ้งเอาท์พุทแทนที่จะบันทึกไว้ที่ไหนสักแห่ง และฉันถูกที่2>&1
เปลี่ยนเส้นทางstderr
ไปstdout
? บางทีคุณอาจต้องการชี้แจงด้วย ... ขอบคุณ