ใช้กระบวนการในพื้นหลัง


1

ฉันมีคำถาม 2 ข้อเกี่ยวกับการเริ่มต้นกระบวนการในพื้นหลัง:

  1. เหตุใดการเริ่มต้นกระบวนการในพื้นหลังจึงเป็นเช่นนั้น:

    ./my_program &

    ( my_program มีชุดอนุญาต exe แน่นอน) ไม่ได้ทำ ต้องการสั่งพิมพ์พรอมต์คำสั่งเหมือนกับคำสั่งอื่น ๆ ก็แค่ เว้นบรรทัดใหม่ว่างไว้ด้วยเคอร์เซอร์กะพริบ

  2. เมื่อฉันเรียกใช้กระบวนการใหม่ต่อไปใน bash พื้นหลังจะแสดง sth เช่นนั้น:

    ./my_program & [30] 1439 [27] Done ./my_program [28] Done ./my_program [29] Done ./my_program

    หมายความว่าเริ่มต้น อีกกระบวนการพิเศษในพื้นหลังทำให้ระบบ แสดงข้อมูลเกี่ยวกับกระบวนการแสดงตัวอย่าง ( [27], [28], [29] บรรทัด) ตราบใดที่เริ่มต้นในปัจจุบัน) ( [30] บรรทัด)?


จะเกิดอะไรขึ้นถ้าคุณกด <return> อีกครั้งหรือไม่ คุณได้รับพรอมต์หรือไม่?
Attie

คำตอบ:


0
  1. สิ่งนี้ไม่ควรเกิดขึ้น เมื่อคุณรันคำสั่งในแบ็คกราวน์แบ็คกราวน์เพียงแค่พิมพ์หมายเลขงานและ pid (ดูด้านล่าง) จากนั้นกลับไปที่พรอมต์คำสั่ง

    เหตุผลเดียวที่ฉันรู้ว่านำไปสู่การทุบตีที่จะทำให้คุณมีบรรทัดใหม่ในสถานการณ์นี้คือถ้าคำสั่งของคุณไม่มีอยู่จริงเพราะมันจะให้ข้อความแสดงข้อผิดพลาดหลังจากพิมพ์ PS1:

    $ nonexistant_command &
    [1] 13856
    $
    nonexistant_command: command not found
    <empty line with blinking cursor here>
    

    ไม่ว่าจะเกิดจากสาเหตุใดก็ตามการกด Enter ขณะที่อยู่ในบรรทัดว่างนี้ควรพิมพ์บรรทัดใหม่ด้วยข้อความแจ้งตามปกติของคุณ (และอาจเป็นข้อความที่งานที่คุณเพิ่งวางไข่เสร็จแล้วดูด้านล่าง)

  2. ผลลัพธ์เพิ่มเติมที่คุณเห็นคือการทุบตีบอกคุณเกี่ยวกับงานพื้นหลังปัจจุบัน:

    ก่อนอื่นจะบอกหมายเลขงานปัจจุบันของกระบวนการพื้นหลังที่สร้างขึ้นใหม่พร้อมกับ pid ดังนี้

    $ some_command &
    [1] 1234
    

    ซึ่งหมายความว่าคำสั่ง some_command กำลังรันด้วย pid 1234 เป็นงาน 1

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

    [1]  Done                    some_command
    

    ซึ่งหมายความว่างานที่มีหมายเลข 1 ซึ่งทำงาน some_command เสร็จสิ้นแล้ว

    หากต้องการค้นหาว่างานทุบตีพื้นหลังใดที่กำลังติดตามอยู่คุณสามารถใช้ jobs builtin เช่นนั้น:

    $ jobs
    [1]  Running                 some_command &
    [2]  Running                 some_other_command &
    

    เพื่อนำงานไปสู่เบื้องหน้าคุณสามารถใช้ fg:

    $ fg 2
    some_other_command
    

    สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนี้ลอง help jobs

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