ฉันรู้ว่าใน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 stuffmyprogram & more stuff
nohupรันโปรแกรมเฉพาะที่มีสัญญาณ SIGHUP ถูกละเว้น เมื่อปิดเทอร์มินัลเคอร์เนลจะส่ง SIGHUP ไปยังกระบวนการควบคุมในเทอร์มินัลนั้น (เช่นเชลล์) เชลล์จะส่ง SIGHUP ไปยังงานทั้งหมดที่ทำงานในพื้นหลัง การรันงานด้วยnohupจะป้องกันไม่ให้ถูกฆ่าด้วยวิธีนี้หากเครื่องตาย (ซึ่งเกิดขึ้นเช่นหากคุณเข้าสู่ระบบจากระยะไกลและการเชื่อมต่อลดลงหรือหากคุณปิดโปรแกรมจำลองเครื่องเทอร์มินัล)
nohupnohup.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สัญญาณโดยการประชุมทางสถานีเตือนกระบวนการขึ้นอยู่กับการออกจากระบบ