หากฉันเริ่มกระบวนการพื้นหลังแล้วออกจากระบบจะทำงานต่อไปได้หรือไม่


29

การถามสิ่งนี้หลังจากการสนทนากับเพื่อนร่วมงานเป็นเวลานานฉันต้องการคำอธิบายที่นี่จริงๆ

ฉันเรียกใช้กระบวนการพื้นหลังโดยการต่อท้าย " &" ไปยังบรรทัดคำสั่งหรือโดยการหยุดCTRL-Zและกลับมาทำงานต่อในพื้นหลังด้วย " bg" จากนั้นฉันออกจากระบบ

เกิดอะไรขึ้น?

เราค่อนข้างแน่ใจว่ามันควรถูกสังหารโดย SIGHUP แต่สิ่งนี้ไม่ได้เกิดขึ้น เมื่อเข้าสู่ระบบอีกครั้งเป็นกระบวนการที่มีความสุขการทำงานและpstreeแสดงให้เห็นว่ามันเป็น "ลูกบุญธรรม" initโดย

นี่เป็นพฤติกรรมที่คาดหวังหรือไม่?

แต่ถ้าเป็นเช่นนั้นแล้วอะไรnohupคือวัตถุประสงค์ของคำสั่ง? ดูเหมือนว่ากระบวนการจะไม่ถูกฆ่าอย่างไรก็ตามมีหรือไม่มี ...


แก้ไข 1

รายละเอียดเพิ่มเติมบางส่วน:

  • คำสั่งถูกเรียกใช้จากเซสชัน SSH ไม่ใช่จากฟิสิคัลคอนโซล
  • คำสั่งถูกเรียกใช้โดยไม่มี nohupและ / หรือ&; มันถูกระงับแล้วด้วยและกลับมาในพื้นหลังด้วยCTRL-Zbg
  • เซสชัน ssh ไม่ได้ลดลง มีการออกจากระบบจริง ( exitคำสั่ง "")
  • กระบวนการนี้เป็นการscpดำเนินการคัดลอกไฟล์
  • เมื่อเข้าสู่ระบบอีกครั้งแสดงให้เห็นกระบวนการทำงานและเป็นลูกของpstreeinit

แก้ไข 2

หากต้องการระบุคำถามให้ชัดเจนยิ่งขึ้น: การวางกระบวนการในพื้นหลัง (โดยใช้&หรือbg) ทำให้ละเว้นSIGHUPเช่นเดียวกับnohupคำสั่งใช่หรือไม่


แก้ไข 3

ฉันลองส่งด้วยตนเองSIGHUPไปที่scp: มันออกแล้วดังนั้นจะไม่เพิกเฉยต่อสัญญาณแน่นอน

จากนั้นฉันลองเปิดตัวอีกครั้งวางไว้ในพื้นหลังและออกจากระบบ: มัน "รับ" initและดำเนินการต่อและฉันพบว่ามีเมื่อเข้าสู่ระบบกลับ

ตอนนี้ฉันค่อนข้างงงแล้ว ดูเหมือนว่าไม่มีSIGHUPการส่งการออกจากระบบ upong ทั้งหมด


ฉันไม่เห็นการกล่าวถึงคอนโซล I / O ใด ๆ ซึ่งจะทำให้การเดินทางสะดวกขึ้น คุณเบี่ยงเบนความสนใจไปเช่น1>/dev/null 2>&1ทุบตี ฯลฯ หรือไม่?
Avery Payne

ไม่ฉันไม่ได้ทำ แน่นอนว่า SCP ไม่ต้องการอินพุตมาตรฐาน ... และดูเหมือนว่าเอาต์พุตมาตรฐานจะไม่เป็นปัญหา
Massimo

ไม่ว่าเชลล์ของคุณจะถูกดำเนินการในฐานะเชลล์การเปลี่ยนแปลงประสิทธิภาพหรือไม่ซึ่งอาจเป็นกรณีนี้
วอร์เนอร์

ทำแบบทดสอบอื่น ๆ ; ผมสรุปมันขึ้นที่นี่: serverfault.com/questions/117152
Massimo

คำตอบ:


20

พบคำตอบ

สำหรับ BASH นี้จะขึ้นอยู่กับhuponexitตัวเลือกของเชลล์ซึ่งสามารถดูและ / หรือตั้งค่าโดยใช้shoptคำสั่งในตัว

ดูเหมือนว่าตัวเลือกนี้จะปิดโดยปริยายอย่างน้อยในระบบที่ใช้ RedHat

ข้อมูลเพิ่มเติมเกี่ยวกับหน้าคน BASH :

เชลล์ออกโดยค่าเริ่มต้นเมื่อได้รับ SIGHUP ก่อนออกจากเชลล์แบบโต้ตอบจะส่ง SIGHUP ไปยังงานทั้งหมดไม่ว่าจะรันหรือหยุด งานที่หยุดจะถูกส่ง SIGCONT เพื่อให้แน่ใจว่าพวกเขาได้รับ SIGHUP เพื่อป้องกันไม่ให้เชลล์ส่งสัญญาณไปยังงานเฉพาะควรลบมันออกจากตารางงานด้วย built-in ที่สร้างขึ้น (ดูที่คำสั่ง SHELL BUILTIN ด้านล่าง) หรือทำเครื่องหมายว่าไม่รับ SIGHUP โดยใช้ disown -h

หากตั้งค่าตัวเลือก huponexit shell ด้วย shopt แล้ว bash จะส่ง SIGHUP ไปยังงานทั้งหมดเมื่อเชลล์ล็อกอินแบบโต้ตอบออก


2
นั่นเป็นค่าเริ่มต้นที่โง่ แต่ความกล้าของฉันบอกฉันว่ามันเป็นความผิด RH มากกว่าทุบตี Btw ด้วย zsh คุณสามารถใช้ &! เป็นทางลัดในการปฏิเสธและประมวลผลพร้อม & รับการถอนหายใจ
Jürgen Strobel

7

ฉันเห็นด้วยกับ Warner และเพียงต้องการเพิ่มว่าคุณสามารถป้องกันไม่ให้เชลล์ส่ง SIGHUP ด้วยคำสั่ง builtin "disown" หน้าคนทุบตีมีคำอธิบายที่ดี


4

คุณสามารถใช้คำสั่งnohupเพื่อเรียกใช้คำสั่งและเปลี่ยนเส้นทางเอาต์พุตไปยังไฟล์เอาต์พุต nohup จากหน้าคน nohup:

nohup - run a command immune to hangups, with output to a non-tty

ตัวเลือกอื่นคือใช้คำสั่งหน้าจอ ประโยชน์ของการใช้หน้าจอคือคุณสามารถเชื่อมต่อกับกระบวนการได้ในภายหลัง


ทำไมต้องลงคะแนน การใช้ nohup และหน้าจอเป็นวิธีที่ยอมรับได้อย่างสมบูรณ์แบบเพื่อหลีกเลี่ยงการฆ่ากระบวนการเมื่อออกจากระบบ มีอีกหลายคน แต่งานทั้งสองนี้ ตกลงคืออะไร?
Jim

2
ฉันคิดว่ามันเป็นจุดที่ดี แต่คำถามเกี่ยวกับสาเหตุที่กระบวนการของเขาไม่ถูกฆ่าไม่ใช่ "วิธีที่จะป้องกันไม่ให้พวกเขาถูกฆ่า"
CarpeNoctem

2

เมื่อคุณแยกโพรเซสลงในพื้นหลังมันจะยังเป็นโพรเซสย่อยจากเชลล์ที่รันมัน

กระบวนการลูกทั้งหมดที่ทำงานภายใต้เปลือกจะถูกส่ง SIGHUP เมื่อออก ประสิทธิภาพแตกต่างกันเล็กน้อยขึ้นอยู่กับสถานการณ์ที่แน่นอนซึ่งมีรายละเอียด verbosely ใน manpage ของทุบตี กระสุนอื่นอาจมีคำอธิบายที่คล้ายกัน

Apache และ daemons อื่น ๆ โดยทั่วไปจะโหลดการกำหนดค่าบน SIGHUP ยูทิลิตี Userspace มักตาย ประสิทธิภาพของแอปพลิเคชันที่เชื่อมโยงกับสัญญาณอาจไม่ซ้ำกับแอปพลิเคชัน


ดังนั้นกระบวนการควรเพิ่งได้รับ SIGHUP ในกรณีนี้ใช่ไหม บางทีมันอาจจะไม่สนใจฉันจะตรวจสอบ
Massimo

ใช่แล้ว นั่นคือสิ่งที่ฉันเชื่อว่าเป็นสถานการณ์ หากคุณสงสัยถึงประสิทธิภาพของเอกสารคุณสามารถแฮ็คสคริปต์เล็กน้อยเพื่อดักจับสัญญาณและบันทึก
วอร์เนอร์

0

กระบวนการอะไร ประสิทธิภาพที่อธิบายไว้ในการโพสต์ก่อนหน้า1มีความแม่นยำ

ฟังก์ชันและกระบวนการสคริปต์บางอย่างสามารถดักจับสัญญาณได้ ในขณะที่ลูปสามารถวิ่งหนีอย่างบ้าคลั่ง

ดู:

เซสชัน SSH ลดลง - คำสั่งดำเนินการต่อหรือไม่?

แก้ไข 1 เวลา 16:22 น

จาก manpage ทุบตี:

The shell exits by default upon receipt of a SIGHUP.   Before  exiting,
an  interactive  shell  resends  the  SIGHUP  to  all  jobs, running or
topped.

การวิจัยเบื้องต้น1แสดงว่า OpenSSH อาจเพิกเฉยต่อ SIGHUP ซึ่งอาจเป็นสัญญาณมากกว่านี้


จริงๆแล้วโพสต์นั้นทำให้ฉันต้องถามคำถาม สำหรับรายละเอียดโปรดดูการแก้ไขด้านบน
Massimo

2
คำตอบในหัวข้ออื่น ๆ ทำให้ดูเหมือนว่าคุณจำเป็นต้องอ่านคำสั่ง SCP ที่คุณใช้และดูว่ามันตอบสนองต่อ SIGHUP อย่างไร
mfinni

และ 'nohup' สำหรับคำสั่งที่คุณรู้ว่าจะตายด้วย SIGHUP และคุณไม่ต้องการให้พวกเขาทำฉันเดา
mfinni

หน้าคนไม่ได้บอก ฉันจะลองฆ่ามัน -HUP พรุ่งนี้ ...
Massimo

-1

หากคุณไม่ได้เรียกใช้คำสั่งผ่านเครื่องมือเช่นscreenเมื่อสิ้นสุดเซสชันดังนั้นงาน / งานทั้งหมดที่เกี่ยวข้องกับเซสชันนั้น


นั่นคือสิ่งที่ฉันคิดยกเว้น ... พวกเขาไม่ได้
Massimo

พวกเขามีทุกครั้งที่ฉันทำสิ่งที่คุณอธิบาย ... บางทีมันอาจจะขึ้นอยู่กับเปลือกหอยที่คุณใช้?
วอร์เรน

-1 พวกเขาทำไม่ได้; คำตอบนั้นไม่ง่ายนัก ฉันเพิ่งทดสอบเชลล์สคริปต์แบบง่าย ๆ ที่ฉันเริ่มทำงานในพื้นหลัง มันวนลูปและส่งออกไปยังไฟล์ชั่วคราว มันยังคงทำงานหลังจากที่ฉันออกจากสถานี (เท่าที่เห็นจากtail -fไฟล์ temp นี้บนเครื่อง CentOS 7.1 โดยใช้ทุบตี
Mike S

@MikeS - กรุณาอธิบาย ฉันไม่เคยเห็นพฤติกรรมที่คุณอธิบาย
วอร์เรน

@warren - ดูคำตอบของฉันserverfault.com/questions/117152/... โปรดทราบว่าผู้คนจำนวนมากอ้างว่าพฤติกรรมแตกต่างจากที่คุณอธิบาย แน่นอน Massimo โพสต์อย่างแม่นยำเพราะกระบวนการของเขายังคง
Mike S
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.