คุณต้องการ 'nohup' เมื่อใดหากคุณใช้ '&' ไปแล้ว?


26

ครั้งแรกคำถามนี้เกี่ยวข้อง แต่ไม่เหมือนคำถามนี้ดีมาก:

ความแตกต่างระหว่าง nohup, บอกเลิกและ &

ฉันต้องการที่จะเข้าใจบางสิ่งบางอย่าง: เมื่อฉันทำ '&' ฉันกำลังฟาดฟันใช่มั้ย

มีประโยชน์ไหมที่จะทำ "nohup ... &" หรือเพียงแค่ & เพียงพอ

มีคนแสดงกรณีที่คุณใช้ '&' และยังต้องการใช้ 'nohup' หรือไม่


1
คุณอ่านคำตอบที่ได้รับการยอมรับแล้ว พวกเขาอธิบายสิ่งที่nohupทำ ส่วนไหนที่คุณสับสน
Gilles 'หยุดความชั่วร้าย' ใน

3
@Gilles: มันอาจจะชัดเจนสำหรับคุณเพราะคุณคุ้นเคยกับสิ่งเหล่านี้ (เห็นตัวแทนของคุณ) ... อย่างไรก็ตามสำหรับการเริ่มต้นคำตอบที่ได้รับการยอมรับในลิงค์ที่ฉันใส่ไว้ไม่ได้พูดอะไรเกี่ยวกับการใช้ ทั้งnohupและ '&' ... ฉันค่อนข้างแน่ใจว่าคำถามของฉันชัดเจนเพียงพอและแตกต่างจากคำถามอื่นและคำตอบที่ยอดเยี่ยมสองข้อที่นี่ดูเหมือนจะพิสูจน์ได้ ) นอกจากนี้คุณหมายถึงฉันใช้ความเจ็บปวดในการเชื่อมโยงไปยังคำถามอื่น แต่ไม่ได้อ่านคำตอบที่ยอมรับ!
Cedric Martin

คำตอบ:


32

ก่อนอื่นทุกครั้งที่คุณรันคำสั่งเชลล์คุณจะแยกกระบวนการใหม่โดยไม่คำนึงว่าคุณจะรันด้วย&หรือไม่ &หมายความว่าคุณกำลังรันอยู่ในพื้นหลังเท่านั้น

โปรดทราบว่านี่ไม่ถูกต้องมาก คำสั่งบางคำสั่งเช่นเดียวกับcdฟังก์ชันของเชลล์และโดยปกติจะไม่แยกกระบวนการใหม่ type cmdมักจะบอกคุณว่าcmdเป็นคำสั่งภายนอกหรือฟังก์ชั่นเปลือก type typeบอกคุณว่าtypeตัวเองเป็นฟังก์ชั่นเปลือก

nohupเป็นสิ่งที่แตกต่าง SIGHUPมันบอกว่ากระบวนการใหม่ที่จะไม่สนใจ เป็นสัญญาณที่ส่งโดยเคอร์เนลเมื่อปิด parent parent

ในการตอบคำถามของคุณให้ทำดังต่อไปนี้:

  1. เรียกใช้emacs & (โดยค่าเริ่มต้นควรจะทำงานในหน้าต่าง X ที่แยกต่างหาก)
  2. exitบนเปลือกแม่ทำงาน

คุณจะสังเกตเห็นว่าemacsหน้าต่างถูกฆ่าแม้ว่าจะทำงานในพื้นหลัง นี่คือพฤติกรรมเริ่มต้นและnohupมีการใช้อย่างแม่นยำเพื่อแก้ไข

ใช้งานในพื้นหลัง (ด้วย&หรือbgฉันเดิมพันเชลล์อื่น ๆ ที่มีไวยากรณ์อื่น ๆ เช่นกัน) เป็นคุณสมบัติเชลล์ที่เกิดจากความสามารถของระบบที่ทันสมัยเพื่อมัลติทาสก์ แทนการฟอร์กอินสแตนซ์เปลือกใหม่สำหรับโปรแกรมที่คุณต้องการที่จะเปิดตัวทุกเปลือกหอยที่ทันสมัย ( bash, zsh, ksh, ... ) จะมีความสามารถในการจัดการรายการของโปรแกรม (หรืองาน ) มีเพียงหนึ่งครั้งเท่านั้นที่สามารถอยู่เบื้องหน้าซึ่งหมายความว่าจะได้รับโฟกัสของเชลล์ ฉันต้องการใครสักคนที่สามารถขยายเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างขั้นตอนการทำงานในเบื้องหน้าและเป็นหนึ่งในพื้นหลัง (หลักที่ถูก acess ไปstdin/ stdout)

ในกรณีใด ๆ SIGHUPนี้ไม่ได้ส่งผลกระทบต่อวิธีการตอบสนองกระบวนการเด็ก nohupทำ.


+1 กับคุณทั้งคู่เพื่อคำตอบที่ยอดเยี่ยม ... แต่ฉันยังสับสนอยู่ ... ฉันลองก่อนที่จะตอบคำถามของฉัน: บางที (เก่ามาก) การตั้งค่า Debian Linux ของฉันไม่ได้รับการกำหนดค่าอย่างถูกต้อง แต่ถ้าฉัน "emacs & "แล้วพิมพ์" exit "มีเพียง xterm ของฉันเท่านั้นที่ออก: emacs อยู่ที่นั่น
Cedric Martin

Emacs นั้นซับซ้อนพอที่จะจัดการ SIGHUP ได้ด้วยตัวเอง เป็นค่าเริ่มต้นเท่านั้นที่กระบวนการออกจาก SIGHUP โปรแกรม 'daemon' จำนวนมากเช่น ntpd หรือ inetd จะอ่านการกำหนดค่าของพวกเขาอีกครั้งใน SIGHUP แทนที่จะออก ฉันเป็นคนที่แต่งตัวประหลาดมากดังนั้นฉันจึงไม่ได้มีประสบการณ์กับ emacs มากนัก
Bruce Ediger

3
ไม่มีอะไรพิเศษเกี่ยวกับ emacs โดยทั่วไปแล้วเชลล์จะส่งSIGHUPไปยังกระบวนการลูกของมันเมื่อเชลล์เองได้รับSIGHUPไม่ใช่เมื่อเชลล์ออกจากปกติ bash มีตัวเลือกhuponexitที่ทำให้มันส่งSIGHUPไปยังลูก ๆ เมื่อมันออก แต่มันไม่ได้เปิดใช้งานโดยค่าเริ่มต้น gnu.org/software/bash/manual/bashref.html#Signals
Keith Thompson

สวัสดี. ก่อนอื่นคำอธิบายที่ดี ผมพยายามที่จะตรวจสอบวิทยานิพนธ์ของคุณโดยใช้กระบวนการที่มีและปิดเปลือกของฉันด้วยการวิ่ง& exitกระบวนการยังคงทำงานอยู่ ความคิดเห็นใด ๆ เกี่ยวกับสาเหตุที่มันไม่ถูกฆ่า? หรือฉันกำลังพลาดบางสิ่งที่นี่
Ali Yılmaz

คุณกำลังทำกระบวนการอะไร
rahmu

16

มันเคยมีประโยชน์ที่จะทำnohup ... &? ใช่. หากคุณเพิ่งเริ่มต้นกระบวนการ "ในพื้นหลัง" ด้วย&กระบวนการใหม่นั้นยังคงมีการเป็นสมาชิกใน "กลุ่มกระบวนการ" ของเชลล์ดั้งเดิม หากเชลล์หรือกลุ่มกระบวนการนั้นได้รับสัญญาณบางอย่าง (ตัวอย่างเช่น SIGHUP) โดยค่าเริ่มต้นพวกเขาจะออก ซึ่งหมายความว่าหากคุณรันโปรเซสด้วย&จากเชลล์ที่เริ่มต้นด้วย xterm หรือ rxvt หรือเทอร์มินัลอีมูเลเตอร์ windowing อื่น ๆ เมื่อคุณปิดหน้าต่างกระบวนการพื้นหลังจะได้รับ SIGHUP รหัสที่เขียนอย่างไม่เป็นทางการส่วนใหญ่ไม่ได้จัดการ SIGHUP ดังนั้นจึงออก

หากคุณทำเช่นnohup ... &นั้นnohupคำสั่งจะตั้งค่า SIGHUP เป็นละเว้นและจากนั้นประมวลผลคำสั่ง คำสั่ง exec'ed ใหม่นั้นเก็บมาสก์สัญญาณไว้นั้นnohupเว้นแต่ว่าคำสั่งจะจัดการสัญญาณบางอย่างเอง หากคุณปิด xterm หรือ rxvt หรืออะไรก็ตามเคอร์เนลจะส่ง SIGHUP ไปยังกระบวนการของคำสั่งซึ่งจะถูกละเว้น มันวิ่งต่อไป

การทำnohupคำสั่งให้เปิดใช้งานหลังจากที่คุณปิด xterm หรือออกจากระบบ


ขอโทษ - คุณทำฉันหาย คุณกำลังบอกว่าการใช้&กับnohupทำให้คำสั่งทำงานในบางกรณีที่การใช้เพียงอย่างเดียวnohupจะไม่เกิดขึ้นหรือไม่ ที่ดูเหมือนจะขัดแย้งกับคำตอบที่นี่: unix.stackexchange.com/a/288064/1822
Mike B

2
@MikeB - "&" ทำการแยก / ตั้งค่าสิ่งต่าง ๆ / เรียกระบบ exec เพื่อวางคำสั่ง "ในพื้นหลัง" นั่นคือคำสั่งที่รับ nohupped กำลังทำงานแบบอะซิงโครนัส สิ่งnohupนี้ทำบางสิ่งก่อนการexec()เรียกของระบบเพื่อทำให้กระบวนการที่แยกออกมาไม่สนใจสัญญาณบางอย่าง ดังนั้นใช่ "&" จะอนุญาตให้คำสั่งทำงานภายใต้สถานการณ์บางอย่างที่คนธรรมดาnohupจะไม่ทำ เช่นเดียวกับการปิด xterm ที่เกี่ยวข้องกับเชลล์ที่ทำ nohup หรือออกจากระบบ
Bruce Ediger

-1

หากคุณรันโปรแกรมในพื้นหลัง (พร้อม & เป็นคำต่อท้าย) บนระบบปฏิบัติการ linux และออกจากระบบหลังจากนั้นโปรแกรมจะยังคงทำงานต่อไป: ลองใช้งานด้วย:

  ping google.com > ping_result  &

หลังจากล็อกอินกลับตรวจสอบจำนวนบรรทัดในไฟล์เอาต์พุตping_resultที่จะเพิ่มขึ้นเรื่อย ๆ หมายความว่ามันยังคงทำงานอยู่ แต่จะมีการบอกว่ามันจะปิด ถ้าอย่างนั้นการใช้nohupคำสั่งคืออะไร

อีกสถานการณ์ ==> ตามที่ระบุไว้ข้างต้นสำหรับnohup emac &-> ที่ควรจะยังคงemacทำงานหลังจากออกจากระบบ แต่จะไม่แสดงการทำงานหลังจากเข้าสู่ระบบกลับ

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