เหตุใดจึงต้องใช้“ nohup &” มากกว่า“ exec &”


67

ฉันรู้ว่าในnohupฐานะไบนารีมันสามารถเข้าถึงได้จากเชลล์ใด ๆ แต่ในexecตัวอาจมีอยู่ในทุก ๆ เชลล์

มีเหตุผลที่จะชอบหนึ่งในนั้นหรือไม่?

คำตอบ:


113

จะมีอะไรดีไปกว่าปลาหรือจักรยาน? 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 &

27
จักรยาน> ปลา
Chris Jaynes

6
ฉันขอแตกต่าง เห็นได้ชัดว่าปลาเป็นวิธีการขนส่งที่ยอดเยี่ยมหากสามารถนำไปใช้ได้
นี้ต้องการความช่วยเหลือใน

6
@THISUSERNEEDSHELP แต่จักรยานเป็นอาหารที่ดีกว่าแน่นอน?
Gilles

3
@GypsyCosmonaut หลังจากที่คุณเรียกเปลือกจะไม่ทำงานมันได้ถูกแทนที่ด้วยexec firefox firefoxคุณสามารถคิดว่าexecเป็นการรวมการออกจากโปรแกรมและเริ่มใหม่ แต่การรักษา ID กระบวนการเดียวกัน ขั้วช่วยให้ทำงานเพราะไม่มีอะไรที่บอกว่ามันจะหยุด เมื่อคุณออกจาก Firefox ในภายหลังfirefoxกระบวนการจะสิ้นสุดลง เทอร์มินัลแจ้งให้ทราบว่ากระบวนการลูกนั้นได้ออกไปแล้วและจะออกไปตามลำดับ
Gilles

5
ให้ปลาแก่ผู้ชายและให้อาหารเขาหนึ่งวัน มอบจักรยานให้คนหนึ่งและเขาสามารถขี่ไปซูเปอร์มาร์เก็ตและซื้อปลาตลอดชีวิต
David

18

exec & => ดำเนินการกระบวนการเป็นกระบวนการพื้นหลังดังนั้นคุณอาจใช้งานเทอร์มินัลต่อไปสำหรับงานอื่น

nohup => หลีกเลี่ยง SIGHUP ทั้งหมด (ยุติสัญญาณ) และดำเนินการต่อไปแม้ว่าคุณจะปิดเครื่องก็ตาม

execกระบวนการจะตายเมื่อSIGHUPได้รับ แต่nohupกระบวนการยังคงดำเนินต่อไป


1
คำตอบนี้ดูเหมือนจะถูกต้อง ดังที่คำตอบอื่น ๆ ที่กล่าวไว้ข้างต้นโดยปกติexecจะแทนที่กระบวนการที่กำลังทำงานอยู่ แต่ดูเหมือนจะไม่เกิดขึ้นเมื่อคุณใช้&แบ็คกราวน์คำสั่ง exec'd ทั้งใน bash และ zsh
Dan Pritts

@DanPritts คุณหมายถึงอะไรที่ไม่เกิดขึ้น การประมวลผลย่อยที่พื้นหลังเริ่มต้นแล้วแทนที่เช่นexec smth &เดียวกับ(exec smth) &ที่เกิดอะไรขึ้น?
phk

1
ฉันหมายความว่ามันจะไม่ถูกเรียกใช้ในแง่ที่ปกติแล้วคุณจะนึกถึง (แทนที่เชลล์ที่กำลังทำงานอยู่ในปัจจุบัน) - มันเพิ่งถูกเรียกใช้เป็นกระบวนการแบ็คกราวน์ (exec smth) &ผมคิดว่ามันอาจจะเป็นเช่นเดียวกับ แต่ฉันไม่คาดหวังว่ามันจะเหมือนกัน - ฉันคาดหวังว่ามันจะเป็นข้อผิดพลาดทางไวยากรณ์คุณสามารถดำเนินการกระบวนการ (แทนที่ตัวคุณเอง) แล้วประมวลผลกระบวนการ exec'd ได้อย่างไร คุณไม่ได้อยู่ที่นั่นอีกแล้ว
Dan Pritts

2

คำสั่งเชลล์ในตัว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 (ยาวเกินไปที่จะคัดลอกที่นี่ในความคิดเห็น ... ) ผมทำอะไรผิดหรือเปล่า?
Stéphane

2

คุณไม่สามารถเปรียบเทียบกับnohup execเมื่อคุณเรียกใช้ปฏิบัติการด้วยnohupกระบวนการจะไม่ถูกฆ่าเมื่อคุณออกจากระบบ (เซสชัน ssh); มักnohupจะใช้กับniceการเรียกใช้กระบวนการที่มีลำดับความสำคัญต่ำกว่า HUPสัญญาณโดยการประชุมทางสถานีเตือนกระบวนการขึ้นอยู่กับการออกจากระบบ

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