คุณจะส่งแอพบรรทัดคำสั่งไปยังพื้นหลังโดยตรงได้อย่างไร


22

ฉันรู้แล้วว่าการกดctrl+zหยุดแอพจากนั้นฉันสามารถส่งแอปไปที่พื้นหลังด้วยbgคำสั่ง แต่นั่นหมายความว่ามีช่วงเวลาสั้น ๆ ที่แอพหยุดทำงาน

ฉันจะส่งแอพไปยังพื้นหลังโดยตรงโดยไม่หยุดได้อย่างไร


ค่อนข้างแน่ใจว่าคุณทำไม่ได้ถ้ามันทำงานอยู่แล้ว
Kevin

1
หากงานของคุณต้องการการป้อนข้อมูลของคุณ "ก่อนที่จะหายไป" เป็นพื้นหลังคุณสามารถใช้เครื่องมือเช่น zenity หรือ yad (ถ้าคุณชอบ guis) พวกเขายังสามารถส่งและรับเอาท์พุทจากพื้นหลัง ฉันแน่ใจว่าการเล่นกับไพพ์และอุปกรณ์จะช่วยให้คุณเข้าถึงคอนโซลจากพื้นหลังได้ แต่ฉันไม่แน่ใจว่าจะทำอย่างไร
Joe

@ โจนั่นเจ๋ง แต่ไม่ได้หมายความว่าฉันหมายถึงอะไร ฉันแค่ต้องการส่งแอปไปยังพื้นหลังโดยตรงโดยไม่ต้องหยุดชั่วคราว คือไม่ต้องกดตามด้วยการใช้คำสั่งctrl+z bgมีคำสั่งผสมการกดแป้นเดียวเพื่อส่งแอปไปยังพื้นหลังหรือไม่?
trusktr

คำตอบ:


17

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

การปิดอย่างใกล้ชิดคือการส่งแอปพลิเคชันไปยังพื้นหลังอย่างรวดเร็ว ท้ายที่สุดแล้วแอปพลิเคชั่นจะแชร์เวลา CPU กับผู้อื่นและการหยุดชั่วคราวสักสองสามร้อยวินาทีไม่น่าจะสำคัญ (มันใช้สำหรับแอปพลิเคชันแบบเรียลไทม์ดังนั้นตรวจสอบให้แน่ใจว่าได้เริ่มต้นด้วยแบ็คกราวน์) ฉันใช้เชลล์การเชื่อมสำหรับCtrl+ Zที่ส่งงานที่อยู่เบื้องหน้าไปยังพื้นหลัง ด้วยวิธีนี้การกดCtrl+ Z Ctrl+ Zส่งงานไปที่พื้นหลังด้วยเวลาพักงานน้อยที่สุด

นี่คือ zsh ของฉันผูกพันซึ่งยัง“พื้นหลัง” คำสั่งครึ่งพิมพ์เมื่อบรรทัดคำสั่งไม่ว่างเปล่า

fancy-ctrl-z () {
  emulate -LR zsh
  if [[ $#BUFFER -eq 0 ]]; then
    bg
    zle redisplay
  else
    zle push-input
  fi
}
zle -N fancy-ctrl-z
bindkey '^Z'          fancy-ctrl-z

ในภาษาอังกฤษสำหรับผู้ที่ไม่ใช่ผู้ใช้ zsh ในผู้ชม:

  • นิยามฟังก์ชันเชลล์ที่ทำสิ่งต่อไปนี้:

  • ผูกฟังก์ชันนี้เพื่อ+CtrlZ

หากคุณต้องการให้พื้นหลังทำงานโดยไม่คำนึงว่าบรรทัดคำสั่งว่างเปล่าหรือไม่:

function bg_ { builtin bg "$@"; }
zle -N bg_
bindkey '^Z' bg_

ฉันไม่รู้ว่าคุณสามารถทำสิ่งเดียวกันนี้ได้ด้วยการทุบตี มันควรจะง่ายเหมือนbind -x '"\C-z": bg'ยกเว้นว่า bash จะทิ้งอักขระ tty stop ไว้ดังนั้นจึงไม่ได้รับCtrl+ Zเป็นอินพุต


ที่น่าสนใจให้ฉันดูว่าสิ่งนี้สามารถทำได้ใน Bash ถ้าเป็นเช่นนั้นนี่จะเป็นทางออก ฉันไม่คุ้นเคยกับ zsh รังเกียจที่จะอธิบายว่าสคริปต์ของคุณทำอะไร?
trusktr

@trusktr ดูการแก้ไขของฉัน
Gilles 'หยุดความชั่วร้าย'

ขอบคุณ! ฉันกำลังจะเปลี่ยนไปใช้ zsh ฉันได้ยินสิ่งที่ดีเกี่ยวกับมันมาก
trusktr

15

คุณสามารถแบ็คกราวน์งานได้โดยเพิ่มคำสั่ง&หลังจากนั้น

เช่นtail -f /var/log/messages &จะพื้นหลังงานทันที

เช่นเคยคุณสามารถดูงานที่คุณทำด้วยjobsคำสั่ง

แน่นอนว่าคุณยังไม่ได้รันคำสั่ง


นั่นมีประโยชน์ แต่ไม่ใช่สิ่งที่ฉันหมายถึง หากฉันมีแอพอยู่เบื้องหน้าต้องการส่งไปที่พื้นหลังในภายหลังฉันสามารถกดctrl+zจากนั้นดำเนินการbgที่บรรทัดคำสั่งเพื่อให้แอปทำงานในพื้นหลัง แต่ระหว่างการกดctrl+zและดำเนินการbgมีช่วงเวลาที่แอพหยุดชั่วคราว ฉันไม่ต้องการสิ่งนั้น ฉันจะส่งมันไปยังพื้นหลังได้อย่างไร
trusktr

@trusktr เช่น Gilles กล่าว คุณต้องแจ้งทั้งเชลล์และเทอร์มินัล ขออภัยฉันไม่รู้วิธีการทำเช่นนั้น
prateek61

มันไม่ตอบคำถาม
Luciano Andress Martini

4

การทำคำสั่งให้พื้นหลังทำได้โดยการเพิ่มเครื่องหมายและต่อท้ายคำสั่ง

sleep 300 &

หากมันใช้งานตัวเลือกเดียวของคุณอยู่แล้วให้หยุดการทำงาน


ระหว่างการกด ctrl + z และดำเนินการ bg มีกรอบเวลาที่แอพหยุดชั่วคราวซึ่งเป็นสิ่งที่ฉันไม่ต้องการ ดังนั้นจึงไม่มีวิธีส่งไปยังพื้นหลังทันทีหรือไม่
trusktr

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