ถ้าฉันใช้ emacs จากเปลือก:
$ emacs foo &
แล้วฆ่าเปลือกหอยนั้น emacs ก็ตาย
ฉันจะรันคำสั่งเพื่อที่จะไม่ตายเมื่อเชลล์ตายได้อย่างไร
ฉันพบการอ้างอิงถึง nohup แต่ดูเหมือนจะไม่ช่วย:
$ nohup emacs foo &
ยังคงฆ่า emacs เมื่อกระสุนตาย
ถ้าฉันใช้ emacs จากเปลือก:
$ emacs foo &
แล้วฆ่าเปลือกหอยนั้น emacs ก็ตาย
ฉันจะรันคำสั่งเพื่อที่จะไม่ตายเมื่อเชลล์ตายได้อย่างไร
ฉันพบการอ้างอิงถึง nohup แต่ดูเหมือนจะไม่ช่วย:
$ nohup emacs foo &
ยังคงฆ่า emacs เมื่อกระสุนตาย
คำตอบ:
คุณไม่ต้องพูดถึงว่านี่เป็นแอพ X หรือแอพคอนโซล
หากเป็นแอปคอนโซลแน่นอนว่าต้องปิด คุณกำจัดมันเป็นอินพุต / เอาท์พุตยิ่งเทคนิค (หลอก) tty มันเป็นบน มันไม่น่าเป็นไปได้อย่างมากนี่คือสิ่งที่คุณหมายถึงดังนั้นสมมติว่าคุณกำลังพูดถึงแอพ X
nohup
ควรทำงานไม่แน่ใจว่าทำไมมันไม่ เมื่อเชลล์ปิดมันจะส่งSIGHUP
ไปยังกระบวนการทั้งหมดในกลุ่มกระบวนการ nohup บอกให้คำสั่งละเว้น SIGHUP
คุณยังสามารถลอง setsid ซึ่งตัดการเชื่อมต่อกระบวนการจากกลุ่มกระบวนการ
alias emacs='setsid emacs'
หรือเพิ่มdisown
หลังจาก&
วิธีที่น่าเชื่อถือที่สุดดูเหมือนจะเป็น:
(setsid emacs &)
สิ่งนี้ใช้( &)
เพื่อแยกเป็นแบ็คกราวด์และsetsid
แยกออกจากการควบคุม tty
คุณสามารถใส่สิ่งนี้ในฟังก์ชั่นเชลล์
fork() { (setsid "$@" &); }
fork emacs
ความเป็นไปได้คือ:
disown
คำสั่ง builtin:
emacs &
disown $!
&
ทำหน้าที่เป็นตัวคั่นคำสั่งและdisown
จะใช้ค่าเริ่มต้นกับงานล่าสุดดังนั้นสิ่งนี้สามารถย่อให้เป็น:
emacs & disown
สองครั้งfork()
:
(emacs &)
คำสั่งในวงเล็บ(
)
ถูกรันในกระบวนการเชลล์ที่แยกต่างหาก
setsid
ตามที่แนะนำโดย Rich อาจเป็นตัวเลือกที่ดีที่สุดเนื่องจากไม่สามารถควบคุม TTY ของกระบวนการได้โดยสร้างเซสชันใหม่:
setsid emacs
อย่างไรก็ตามมันก็เป็นสิ่งที่คาดเดาไม่ได้เช่นกัน - มันจะfork()
เป็นแบ็คกราวน์ถ้ามันเป็นหัวหน้าของกลุ่มกระบวนการ (ซึ่งจะไม่เกิดขึ้นหากsetsid
ใช้ในsh
สคริปต์ตัวอย่างเช่นในโอกาสเช่นนี้มันจะทนต่อ Ctrl- เท่านั้น ซี)
(exec emacs)
ทำงานอย่างไร
(emacs)
มันจะไม่แตกต่างจาก หาก subshell จะได้รับคำสั่งเดียวที่จะบอกเป็นนัยอย่างน้อยในกรณีของexec
bash
เช่นเดียวกับเมื่อเทียบกับbash -c 'foo'
bash -c 'exec foo'
( แต่โปรดทราบว่า emacs ตัวเองอาจจะถูกถอดจากสถานี.. gvim ตัวอย่างเช่นทำอย่างนี้มันจะดีกว่าในการทดสอบด้วยโปรแกรมที่มีพฤติกรรมเป็นที่รู้จัก)
ตรวจสอบการตั้งค่าเปลือกของคุณ นอกจากนี้คุณยังสามารถลองหน้าจอnohup
แทน
screen -r
หากคุณใช้Ctrl-A Ctrl-D
เพื่อยกเลิกการเชื่อมต่อก่อนออกจากระบบ
screen -d -m sh -c "{do stuff } exit"
มีเหตุผลมากกว่า