กระบวนการในพื้นหลังโดยไม่มี“ &”


24

สมมติว่าคุณเริ่มต้นแอปพลิเคชันใหม่ใน Linux (เช่นเท็กซ์เอดิเตอร์ ฯลฯ ) แต่คุณลืมใช้“ &” คุณจะใช้คำสั่งใดเพื่อทำให้กระบวนการนั้นทำงานในพื้นหลังโดยไม่ต้องปิดแอปพลิเคชันนั้น ด้วยวิธีนี้คุณสามารถเปิดกระบวนการทั้งสองและแยกการทำงาน (เช่นเทอร์มินัลบรรทัดคำสั่งที่คุณใช้ในการสร้างกระบวนการและกระบวนการเช่นโปรแกรมแก้ไขข้อความยังคงทำงานอยู่?


ในทางเทคนิคไม่ได้ แต่อาจtmuxให้ฟังก์ชั่นเดียวกับที่ต้องการในคำถามของคุณ
mkc

1
อย่ามองข้ามทางเลือกง่าย ๆ ในการเปิดเชลล์อื่นเมื่อเป็นไปได้
jpmc26

คำตอบ:


43

ในหน้าต่างเทอร์มินัลคุณมักจะพิมพ์Control+ Zเพื่อ "หยุด" กระบวนการและจากนั้นใช้bgคำสั่งเพื่อ "พื้นหลัง" มัน

เช่นด้วยคำสั่ง sleep

$ /bin/sleep 1000
^Z[1] + Stopped                  /bin/sleep 1000
$ bg
[1]     /bin/sleep 1000&
$ jobs
[1] +  Running                 /bin/sleep 1000
$ 

เราสามารถเห็นกระบวนการทำงานและฉันยังมีบรรทัดคำสั่งของฉัน


5
อาจเป็นที่น่าสนใจที่จะเพิ่มว่ากระบวนการสามารถนำกลับไปที่พื้นหน้าด้วยfgคำสั่งซึ่งใช้รหัสงาน (ที่ระบุในวงเล็บ1ในกรณีนี้) เป็นพารามิเตอร์ มันไม่ได้เป็นเฉพาะกับการใช้และสามารถทำได้กับกระบวนการเปิดตัวด้วยbg &
แอรอน

14

Ctrl+ Zเป็นวิธีที่จะทำ แต่เพื่อความสมบูรณ์: คำถามถามถึง "คำสั่ง" และนั่นจะเป็น (จากเทอร์มินัลอื่น):

kill -STOP pid_of_the_running_applications

และแน่นอน

bg

จากเทอร์มินัลแอปพลิเคชัน


6
kil -STOP แล้วฆ่า -CONT
Michel Billaud

10

ใน Bash:

Ctrl+ แล้วZbg

ตอนนี้เรียกใช้jobsและดูผลลัพธ์


2
@grooveplex Tomas ตอบก่อนจึงจะเหมาะสมกว่าที่จะแสดงความคิดเห็นด้านล่างคำตอบของ Stephen ว่าเขาเป็นคำตอบโดยทั่วไปของ tomas` โดยมีรายละเอียดเพิ่มเติม
Anthon

2
เราตอบพร้อมกันจริงๆ ไม่น่าแปลกใจที่เราทั้งคู่พูดอย่างเดียวกันเพราะเป็นคำตอบที่ชัดเจน :-) เราทั้งคู่ต่างก็คัดลอก คำตอบของฉันมาถึงหลังจาก Thomas 'ไม่นานเพราะฉันใช้เวลาเพิ่มในการสร้างและจัดรูปแบบตัวอย่าง
Stephen Harris

1
และของฉันบอกว่ามันอยู่ใน Bash ดังนั้นพวกเขาจึงไม่เหมือนกัน
Tomasz

1
เฮ้มีจุดศักยภาพอยู่ที่นั่น มันต้องการให้เชลล์มีการควบคุมงาน บางส่วนของเครื่องแรกที่ผมทำงานอยู่ (SVr2 based) ไม่ได้มีว่าใน/bin/shและอื่น ๆ นี้จะไม่ได้ทำงาน :-)
สตีเฟ่นแฮร์ริส

1

เพื่อเป็นการป้องกันความไม่สะดวกที่ต้องกดCTRL- zคุณสามารถสร้างสคริปต์ตัวตัดคำสำหรับโปรแกรมแก้ไขซึ่งจะเรียกใช้โปรแกรมแก้ไขของคุณในเบื้องหลัง วิธีนี้คุณไม่จำเป็นต้องดูแลการจดจำเพื่อเริ่มต้นในพื้นหลังอย่างชัดเจน:

    #!/bin/sh

    EDITOR="emacs" # or whatever

    if [ -z "${DISPLAY}" ]; then
      ${EDITOR} "$@"
    else
      ${EDITOR} "$@" &
    fi

ด้านบนก่อนอื่นเราลองตรวจสอบว่าคุณมีเซิร์ฟเวอร์ X หรือไม่และจากนั้นเรียกใช้โปรแกรมแก้ไขในพื้นหลัง (หากไม่ใช่เครื่องมือแก้ไข Unix จำนวนมากจะใช้เทอร์มินัลแทนและคุณไม่ต้องการเรียกใช้โปรแกรมแก้ไขเป็นกระบวนการพื้นหลังในกรณีนี้) . มันจะส่งผ่านข้อโต้แย้งทั้งหมดไปยังบรรณาธิการของคุณคำต่อคำที่เลือก ( "$@") เช่นเดียวกับที่คุณให้ไว้สำหรับสคริปต์ wrapper

สำหรับคำสั่งที่คุณหายไป ... จากการทดลองขั้นพื้นฐานของฉันสำหรับโปรแกรม GUI ที่ไม่เกี่ยวข้องกับเทอร์มินัลอาจเป็นเรื่องง่ายเหมือนการส่งครั้งแรกSIGSTOPและจากนั้นSIGCONTไปยังกระบวนการทำงานเบื้องหน้า (ใช้killคำสั่งถ้าคุณใช้เชลล์สคริปต์เพื่อใช้งาน) . แน่นอนว่าคุณจะต้องเรียกใช้มันในหน้าต่าง / แท็บเทอร์มินัลอื่นและความยากลำบากในการอำนวยความสะดวกและในการค้นหา PID ทั่วไปที่คุณต้องการส่งสัญญาณไป โดยค่าเริ่มต้นคุณสามารถส่งสัญญาณทั้งสองไปยังกระบวนการทั้งหมดของชื่อที่กำหนด (ค่าเริ่มต้นไปยังโปรแกรมแก้ไขที่คุณชื่นชอบและอนุญาตให้ใช้ PID เป็นอาร์กิวเมนต์เช่นกัน):

    #!/bin/sh

    EDITOR=emacs # whatever

    stop_cont_prog()
    {
      case "$1" in
        # begin with number is considered PID - this is not good 
        # enough to be taken seriously...
        [1-9]*) kill -SIGSTOP "$1"; kill -SIGCONT "$2";;
        *)      killall -SIGSTOP "$1"; killall -SIGCONT "$2";;
      esac
    }

    if [ -n "$1" ]; then
      for prog in "$@"; do stop_cont_prog "$1"; done
    else  
      stop_cont_prog "${EDITOR}"
    fi

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

SIGSTOPเป็นสิ่งที่ส่งไปยังกระบวนการเบื้องหน้าเมื่อคุณกด (โดยค่าเริ่มต้นร่วมกัน) -CTRL zอ้างถึงstty -aเอาต์พุต

$ stty -a
speed 38400 baud; rows 50; columns 200; line = 0;
intr = ^C; [...] start = ^Q; stop = ^S; susp = ^Z; [...]
[...]

(ตัวย่อเอาต์พุต) และsttyหน้าคู่มือ:

   susp CHAR
          CHAR will send a terminal stop signal

กระบวนการหยุดใช้สัญญาณสามารถเริ่มต้นใหม่โดยการส่งSIGSTOP SIGCONTโดยปกติมันเป็นตรรกะการควบคุมงานเชลล์ที่จะส่งSIGCONTและดูแลการจัดการที่จำเป็นอื่น ๆ ที่เกี่ยวข้องกับfgและbgคำสั่งที่เราไม่สนใจ

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