ตัวอย่างเช่นเมื่อฉันพิมพ์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 &หากคุณไม่ต้องการที่จะเห็นอะไรบางอย่างเช่นการใช้งาน
นอกจากนี้คุณอาจต้องการที่จะเรียนรู้เกี่ยวกับและnohupdisown
disownไม่ได้ป้องกันไม่ให้มีการพิมพ์เอาต์พุตไปยังเทอร์มินัล
/dev/nullเป็นไฟล์เพื่อเปลี่ยนเส้นทางเอาท์พุทขั้วถ้าใครต้องการที่จะทิ้งเอาท์พุทแทนที่จะบันทึกไว้ที่ไหนสักแห่ง และฉันถูกที่2>&1เปลี่ยนเส้นทางstderrไปstdout? บางทีคุณอาจต้องการชี้แจงด้วย ... ขอบคุณ