ออกจาก zsh แต่เปิดงานที่ทำอยู่ทิ้งไว้หรือไม่


96

เพิ่งเปลี่ยนจาก bash เป็น zsh

ใน bash งานเบื้องหลังจะทำงานต่อไปเมื่อเชลล์ออก ตัวอย่างเช่นที่นี่dolphinยังคงทำงานต่อไปหลังจากexit:

$ dolphin .
^Z
[1]+  Stopped                 dolphin .
$ bg
[1]+ dolphin . &
$ exit

นี่คือสิ่งที่ฉันต้องการเป็นพฤติกรรมเริ่มต้น

ในทางตรงกันข้ามพฤติกรรมของ zsh คือการเตือนเกี่ยวกับการรันงานexitจากนั้นปิดหากคุณexitอีกครั้ง ตัวอย่างเช่นที่นี่dolphinถูกปิดเมื่อexitคำสั่งที่สองออกจากเชลล์:

 % dolphin .
^Z
zsh: suspended  dolphin .
 % bg
[1]  + continued  dolphin .
 % exit
zsh: you have running jobs.
 % exit 

ฉันจะสร้างพฤติกรรมเริ่มต้นของ zsh ที่นี่เหมือน bash ได้อย่างไร

คำตอบ:


169

เริ่มโปรแกรมด้วย&!:

dolphin &!

&!( หรือเท่ากัน&| ) เป็นทางลัด zsh เฉพาะทั้งพื้นหลัง และ ปฏิเสธกระบวนการดังกล่าวที่ออกจากเปลือกจะปล่อยให้มันทำงาน


2
เพื่อความสมบูรณ์คุณสามารถระบุวิธีการปฏิเสธเมื่อเริ่มต้นแล้วได้หรือไม่?
trusktr

@trusktr มีคำถามที่แตกต่างกันเกี่ยวกับการปฏิเสธกระบวนการเบื้องหน้าเป็น ฉันคิดว่าควรแยกเก็บไว้เพื่อความชัดเจน สำหรับทุกคนที่สนใจในการ zsh เฉพาะฉันถามคำถามเกี่ยวกับ U & L SE เกี่ยวกับวิธีการสร้างได้เร็วขึ้นเวิร์กโฟลว์สำหรับปฏิเสธกระบวนการเบื้องหน้า
Anko

ฉันชอบโซลูชันนี้และฉันจะใช้มันสำหรับแต่ละคำสั่ง แต่ฉันยังคงมองหาวิธีเปลี่ยนพฤติกรรมเริ่มต้นของ Zsh
Vince

1
@Vince คุณหมายถึงการเปลี่ยนค่าเริ่มต้นเพื่อปฏิเสธกระบวนการที่อยู่เบื้องหลังเสมอหรือไม่? ถ้าคุณสามารถทำกับคุณในsetopt nohup ~/.zshrcจากนั้นการเริ่มต้นคำสั่งที่มีพื้นหลังด้วย&จะเป็นการปฏิเสธเสมอ แม้ว่าโดยค่าเริ่มต้น zsh จะยังคงเตือนคุณว่าคุณกำลังทำงานอยู่เมื่อคุณพยายามออก setopt nocheckjobsคุณสามารถปิดว่าเกินไปกับ
Anko

@ Anko ฉันคิดว่าsetopt nocheckjobsทำในสิ่งที่ฉันต้องการ ตอนนี้ฉันพบตัวเลือกที่มีอยู่ในman zshoptions. ฉันต้องการปิดคำเตือน ฉันรู้ว่าเมื่อฉันมีกระบวนการเบื้องหลังและฉันไม่ต้องการมัน nohupฉันต้องการให้กระบวนการพื้นหลังใกล้จนกว่าฉันเริ่มต้นพวกเขาด้วย ปัจจุบันฉันใช้สิ่งนี้กับฟังก์ชันเชลล์ที่เรียกใช้PyCharmในพื้นหลังด้วยnohup. เมื่อฉันพิมพ์มันจะทำงานpycharm . nohup charm $@ &มันไม่ปิดเมื่อฉันปิดเครื่อง แต่ฉันยังคงได้รับคำเตือนนั้นและต้องพิมพ์exitสองครั้ง
Vince

59

จากเอกสาร zsh :

HUP

... ใน zsh ถ้าคุณมีงานเบื้องหลังที่รันเมื่อเชลล์ออกเชลล์จะถือว่าคุณต้องการให้มันถูกฆ่า ในกรณีนี้จะส่งสัญญาณเฉพาะที่เรียกว่าSIGHUP... หากคุณมักจะเริ่มงานที่ควรดำเนินต่อไปแม้ว่าเชลล์จะออกไปแล้วก็ตามคุณสามารถตั้งค่าตัวเลือกNO_HUPและงานเบื้องหลังจะถูกปล่อยให้อยู่คนเดียว

ดังนั้นเพียงแค่ตั้งค่าNO_HUPตัวเลือก:

% setopt NO_HUP

หากคุณไม่ต้องการคำเตือนใช่
Carl Norum

30

ฉันได้พบว่าการใช้การรวมกันของnohup, &และdisownการทำงานสำหรับฉันเป็นฉันไม่ต้องการที่จะถาวรสาเหตุงานทำงานเมื่อเปลือกได้ออก

nohup <command> & disown

ในขณะที่เพียงแค่&ได้ทำงานให้ฉันในbashผมพบว่าเมื่อใช้เพียงnohup, &หรือdisownในการใช้คำสั่งเช่นสคริปต์ที่เรียกคำสั่งจาวาวิ่งกระบวนการที่จะยังคงหยุดเมื่อเปลือกออก

  • nohupทำให้คำสั่งไม่สนใจNOHUPและSIGHUPส่งสัญญาณจากเชลล์
  • & ทำให้กระบวนการทำงานอยู่เบื้องหลังในขั้นต่ำ
  • disownตามด้วยอาร์กิวเมนต์ (ดัชนีของหมายเลขงานในรายการงานของคุณ) ป้องกันไม่ให้เชลล์ส่งSIGHUPสัญญาณไปยังกระบวนการย่อย การใช้disownโดยไม่มีอาร์กิวเมนต์ทำให้ค่าเริ่มต้นเป็นงานล่าสุด

ฉันพบnohupและdisownข้อมูลในหน้านี้และ&ข้อมูลในคำตอบ SOนี้


5

ฉันมักจะใช้screenเพื่อให้งานเบื้องหลังทำงานอยู่

1) สร้างเซสชันหน้าจอ:

screen -S myScreenName

2) เปิดสคริปต์บริการภูตหรืออะไรก็ตาม

3) ออก (แยก) เซสชันหน้าจอด้วย

screen -d

หรือทางลัด ALT+A then d


หลังจากผ่านไปไม่กี่ร้อยปี - หากคุณต้องการกลับมาใช้งานเซสชันต่อ (แนบใหม่):

screen -r myScreenName

หากคุณต้องการทราบว่ามีเซสชันหน้าจอชื่อและสถานะ (แนบหรือแยก):

screen -ls

โซลูชันนี้ใช้ได้กับล่ามเทอร์มินัลทั้งหมดเช่น bash, zsh เป็นต้นโปรดดูเพิ่มเติม man screen


หมายเหตุสำหรับผู้ใช้ MacOS แป้นพิมพ์ลัดที่จะแยกออกจากหน้าจอคือ Control + A จากนั้น D นอกจากนี้นี่เป็นทางเลือกเดียวของฉันเมื่อฉันปล่อยให้กระบวนการทำงานและยอมแพ้การเขียนหน้าจอ -d จะไม่ช่วย
Bishoy

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