เหตุใดฉันจึงเห็นผลลัพธ์ของกระบวนการพื้นหลัง


31

ตัวอย่างเช่นเมื่อฉันพิมพ์ping 8.8.8.8 &เหตุใดเราจึงเห็นกระบวนการปิงทำงาน และเมื่อฉันพิมพ์find / -name '*test*' &ก็จะเห็นบนจอภาพ

ทำไมถึงเป็นอย่างนั้น? มันไม่ได้อยู่ในพื้นหลังจริงๆเหรอ?

คำตอบ:


43

&นำเปลือกเพื่อเรียกใช้คำสั่งในพื้นหลังคือมันจะคดเคี้ยวและเรียกใช้ในการแยกย่อยเปลือกเป็นงานถ่ายทอดสด

โปรดทราบว่าเมื่อคุณใส่&เอาท์พุท - ทั้งstdout และ stderr - จะยังคงถูกพิมพ์ลงบนหน้าจอ หากคุณไม่ต้องการที่จะเห็นผลใด ๆ บนหน้าจอเปลี่ยนเส้นทางทั้งสองstdoutและstderrไปยังแฟ้มโดย:

myscript > ~/myscript.log 2>&1 &

โดยปกติแล้วคุณอาจต้องการทิ้งstderrโดยเปลี่ยนเส้นทางไปที่/dev/nullหากคุณไม่กังวลเกี่ยวกับการวิเคราะห์ข้อผิดพลาดในภายหลัง

นอกจากนี้คุณยังสามารถเรียกใช้คำสั่ง / สคริปต์ในเวลาเดียวกันในเชลล์ย่อยแยก สำหรับเช่น;

./script1 & ./script2 & ./script3 & 

สามารถนำงานพื้นหลังกลับไปที่บรรทัดคำสั่งก่อนที่จะเสร็จสิ้นด้วยคำสั่ง:

fg <job-number>

job-numberสามารถรับได้โดยการเรียกใช้

jobs

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

@ByteCommander ขอบคุณ :) แก้ไขแล้วหวังว่าจะชัดเจนแล้ว ใช่คุณมีสิทธิ 2>&1เปลี่ยนเส้นทางไปยังstderr stdout
Ron

3
ฉันคิดว่ามันจะคุ้มค่าที่stty tostopจะกล่าวถึงซึ่งจะทำให้งานแบ็คกราวน์ถูกระงับหากพวกเขาพยายามเขียนถึงเทอร์มินัล
kasperd

cmd_with_params> / dev / null 2> / dev / null &
tgkprog

ข้อเสียเพียงอย่างเดียวของการทำเช่นนั้นคือลำดับของเอาต์พุตไปยัง stdout และ stderr สามารถผสมกันในล็อกไฟล์
matthieu

8

เมื่อคุณใช้&กระบวนการทำงานในพื้นหลัง แต่เอาต์พุตมาตรฐานยังคงเป็นเทอร์มินัล

ในความเป็นจริงคุณสามารถเรียกใช้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ไม่ได้ป้องกันไม่ให้มีการพิมพ์เอาต์พุตไปยังเทอร์มินัล
Ruslan

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