ฉันรู้ว่าในnohup
ฐานะไบนารีมันสามารถเข้าถึงได้จากเชลล์ใด ๆ แต่ในexec
ตัวอาจมีอยู่ในทุก ๆ เชลล์
มีเหตุผลที่จะชอบหนึ่งในนั้นหรือไม่?
ฉันรู้ว่าในnohup
ฐานะไบนารีมันสามารถเข้าถึงได้จากเชลล์ใด ๆ แต่ในexec
ตัวอาจมีอยู่ในทุก ๆ เชลล์
มีเหตุผลที่จะชอบหนึ่งในนั้นหรือไม่?
คำตอบ:
จะมีอะไรดีไปกว่าปลาหรือจักรยาน? nohup
และexec
ทำสิ่งต่าง ๆ
exec
แทนที่เชลล์ด้วยโปรแกรมอื่น การใช้exec
งานพื้นหลังอย่างง่ายนั้นไม่มีประโยชน์: exec myprogram; more stuff
แทนที่เชลล์ด้วยmyprogram
ดังนั้นจึงไม่ทำงานซึ่งmore stuff
ต่างจากmyprogram; more stuff
ที่ทำงานmore stuff
เมื่อmyprogram
ยุติ แต่exec myprogram & more stuff
จะเริ่มต้นmyprogram
ในพื้นหลังและจากนั้นก็วิ่งเช่นเดียวกับmore stuff
myprogram & more stuff
nohup
รันโปรแกรมเฉพาะที่มีสัญญาณ SIGHUP ถูกละเว้น เมื่อปิดเทอร์มินัลเคอร์เนลจะส่ง SIGHUP ไปยังกระบวนการควบคุมในเทอร์มินัลนั้น (เช่นเชลล์) เชลล์จะส่ง SIGHUP ไปยังงานทั้งหมดที่ทำงานในพื้นหลัง การรันงานด้วยnohup
จะป้องกันไม่ให้ถูกฆ่าด้วยวิธีนี้หากเครื่องตาย (ซึ่งเกิดขึ้นเช่นหากคุณเข้าสู่ระบบจากระยะไกลและการเชื่อมต่อลดลงหรือหากคุณปิดโปรแกรมจำลองเครื่องเทอร์มินัล)
nohup
nohup.out
นอกจากนี้ยังมีการเปลี่ยนเส้นทางการส่งออกของโปรแกรมไปยังแฟ้ม นี่เป็นการหลีกเลี่ยงโปรแกรมที่กำลังจะตายเนื่องจากไม่สามารถเขียนไปยังเอาต์พุตหรือเอาต์พุตข้อผิดพลาดได้ โปรดทราบว่าnohup
จะไม่เปลี่ยนเส้นทางอินพุต หากต้องการยกเลิกการเชื่อมต่อโปรแกรมอย่างสมบูรณ์จากเทอร์มินัลที่คุณเปิดใช้งานให้ใช้
nohup myprogram </dev/null >myprogram.log 2>&1 &
exec firefox
firefox
คุณสามารถคิดว่าexec
เป็นการรวมการออกจากโปรแกรมและเริ่มใหม่ แต่การรักษา ID กระบวนการเดียวกัน ขั้วช่วยให้ทำงานเพราะไม่มีอะไรที่บอกว่ามันจะหยุด เมื่อคุณออกจาก Firefox ในภายหลังfirefox
กระบวนการจะสิ้นสุดลง เทอร์มินัลแจ้งให้ทราบว่ากระบวนการลูกนั้นได้ออกไปแล้วและจะออกไปตามลำดับ
exec &
=> ดำเนินการกระบวนการเป็นกระบวนการพื้นหลังดังนั้นคุณอาจใช้งานเทอร์มินัลต่อไปสำหรับงานอื่น
nohup
=> หลีกเลี่ยง SIGHUP ทั้งหมด (ยุติสัญญาณ) และดำเนินการต่อไปแม้ว่าคุณจะปิดเครื่องก็ตาม
exec
กระบวนการจะตายเมื่อSIGHUP
ได้รับ แต่nohup
กระบวนการยังคงดำเนินต่อไป
exec
จะแทนที่กระบวนการที่กำลังทำงานอยู่ แต่ดูเหมือนจะไม่เกิดขึ้นเมื่อคุณใช้&
แบ็คกราวน์คำสั่ง exec'd ทั้งใน bash และ zsh
exec smth &
เดียวกับ(exec smth) &
ที่เกิดอะไรขึ้น?
(exec smth) &
ผมคิดว่ามันอาจจะเป็นเช่นเดียวกับ แต่ฉันไม่คาดหวังว่ามันจะเหมือนกัน - ฉันคาดหวังว่ามันจะเป็นข้อผิดพลาดทางไวยากรณ์คุณสามารถดำเนินการกระบวนการ (แทนที่ตัวคุณเอง) แล้วประมวลผลกระบวนการ exec'd ได้อย่างไร คุณไม่ได้อยู่ที่นั่นอีกแล้ว
คำสั่งเชลล์ในตัวexec <command>
จะแทนที่เชลล์ด้วย<command>
ไม่มีกระบวนการใหม่ไม่มีการสร้าง PID ใหม่ หลังจากเสร็จสิ้นการ<command>
ตามปกติขั้วของคุณจะปิด โดยการทำงานในพื้นหลังแรก subshell ถูกสร้างขึ้นซึ่งก็คล้าย ๆ <command>
จะถูกแทนที่โดยทันที
nohup <command>
คำสั่งจะทำงาน<command>
แต่ immume เพื่อ hangups (ฆ่า -s 1) ดังนั้นมันจะไม่ถูกยกเลิกเมื่อเปลือก, terminal จากที่ที่มันเริ่มต้นคือปิดให้บริการ โดยการรันในพื้นหลังก่อนจะสร้างเชลล์ย่อยและคำสั่งจะทำงานในพื้นหลังโดยจะส่งคุณกลับไปที่พรอมต์
ในการเขียนสคริปต์เอฟเฟกต์แบบทันทีจะเหมือนกันมากกว่า<command>
นั้นเริ่มจากสคริปต์ของคุณและสคริปต์จะดำเนินต่อไปโดยไม่รอ<command>
ให้เริ่มส่งออกหรือทำจนเสร็จ
script.sh &
exec script.sh &
ในทั้งสองกรณีคำสั่งจะถูกดำเนินการในกระบวนการลูกมันไม่ได้แทนที่กระบวนการเรียกดู: paste.alacon.org/44474 (ยาวเกินไปที่จะคัดลอกที่นี่ในความคิดเห็น ... ) ผมทำอะไรผิดหรือเปล่า?
คุณไม่สามารถเปรียบเทียบกับnohup
exec
เมื่อคุณเรียกใช้ปฏิบัติการด้วยnohup
กระบวนการจะไม่ถูกฆ่าเมื่อคุณออกจากระบบ (เซสชัน ssh); มักnohup
จะใช้กับnice
การเรียกใช้กระบวนการที่มีลำดับความสำคัญต่ำกว่า HUP
สัญญาณโดยการประชุมทางสถานีเตือนกระบวนการขึ้นอยู่กับการออกจากระบบ