ความแตกต่างระหว่าง“ <command> & disown” และ“ nohup <command> & disown”


41

นี่คือความเข้าใจของฉันเกี่ยวกับการใช้ของ&, disownและnohup:

  • <command>: วิ่งกระบวนการภายในปัจจุบันของสถานีbashเช่นในเบื้องหน้า (คือกระบวนการที่ระบุว่าเป็นbashงานเบื้องหน้าและstdin, stdoutและstderrยังคงผูกไว้กับขั้ว ); ไม่ภูมิคุ้มกัน hangups ;
  • <command> &: วิ่งกระบวนการภายในปัจจุบันของสถานีbashเช่นในพื้นหลัง (คือกระบวนการที่ระบุว่าเป็นbashงานพื้นหลังและstdin, stdoutและstderrยังคงผูกไว้กับขั้ว ); ไม่ภูมิคุ้มกัน hangups ;
  • <command> & disown: วิ่งกระบวนการภายในปัจจุบันของสถานีbashเช่นในพื้นหลังแต่กระบวนการนี้ออกจากbashรายการของงาน ' (คือกระบวนการที่ไม่ได้ระบุว่าเป็นbashเบื้องหน้างานพื้นหลัง / และstdin, stdoutและstderrยังคงผูกพันไปยังสถานี ); ภูมิคุ้มกันต่อ hangups ;
  • nohup <command> & disown: วิ่งกระบวนการภายในปัจจุบันของสถานีbashเช่นในพื้นหลังแต่กระบวนการนี้ออกจากbashรายการของงาน ' (คือกระบวนการที่ไม่ได้ระบุว่าเป็นbashเบื้องหน้างานพื้นหลัง / และstdin, stdoutและstderrจะไม่ได้ยังคงผูกพันไปยังสถานี ) ; ภูมิคุ้มกันต่อ hangups ;

ดังนั้นนอกเหนือจากnohup <command> & disownการปิดกั้นstdinและเปลี่ยนเส้นทางstdoutและstderrไปโดยปริยายก็ดูเหมือนว่าผมชอบที่จะสามารถได้รับการพิจารณาโดยสิ้นเชิงเทียบเท่ากับnohup.out<command> & disown

ถูกต้องทั้งหมดข้างต้นหรือไม่ ความเข้าใจผิดใด ๆ


1
คุณหมายถึงอะไร "ภูมิคุ้มกันต่อ Hangups" และ "ไม่ภูมิคุ้มกันต่อ Hangups"
ความโกลาหล

2
@chaos ผมหมายถึงว่าการยกเลิก / ฆ่าแม่bashเช่นจะไม่ฆ่ากระบวนการ
คอส

คำตอบ:


31

ความเข้าใจของคุณนั้นถูกต้อง ทั้งสองdisownและnohupถูกใช้เพื่ออนุญาตให้คุณออกจากเซสชันเชลล์ที่รันอยู่โดยไม่หยุดทำงาน คำอธิบายบางอย่าง:

  • ไม่มีเหตุผลที่จะทำงานไม่ได้nohup command & disown, nohupแล้วจะปฏิเสธมันสำหรับคุณ

  • nohupจะถูกกำหนดโดย POSIXในขณะที่ไม่ได้เป็นdisown ซึ่งหมายความว่าในขณะที่เปลือกหอยจำนวนมาก (เช่นbash, zsh, ksh) มีมันคนอื่น ๆ (เช่นtcsh, csh, dashและsh) จะไม่ได้มัน

  • disownสามารถใช้หลังจากคำสั่งถูกnohupเรียกใช้ในขณะที่ต้องใช้ก่อน

เท่าที่ฉันสามารถบอกได้ผลที่แท้จริงของคำสั่งทั้งสองนั้นเหมือนกัน พวกเขาแต่ละคนมีคุณสมบัติที่อื่น ๆ ขาด (ดูhelp disownและman nohup) แต่ฟังก์ชั่นพื้นฐานของพวกเขาเหมือนกันใช่

สำหรับการอภิปรายรายละเอียดเพิ่มเติมเกี่ยวกับเครื่องมือเหล่านี้และความแตกต่างระหว่างกันให้ดูที่คำตอบที่นี่:


11
Nohupและdisownไม่ใช่สิ่งเดียวกันและการใช้ทั้งสองคำสั่งร่วมกันจะไม่ซ้ำซ้อน ดูคำตอบนี้สำหรับคำอธิบายเชิงลึก
บันทึก

7

คะแนนแรกและที่สามของคุณดูเหมือนจะไม่เป็นไรแม้ว่าstdin, stdout and stderr are still bound to the terminalจะไม่ใช่ความคิดที่ถูกต้องก็ตาม stdinถูกผูกไว้กับเทอร์มินัลเสมอในแง่ที่ว่าคุณจะใส่ชื่อไฟล์ไปยังคำสั่งผ่านเทอร์มินัลหรือวิธีการใช้เทอร์มินัลเสมอ stdout and stderr are still bound to the terminalไม่เป็นไร

คุณมีstdin, stdout and stderr are not still bound to the terminalในจุดที่สี่ซึ่งไม่ถูกต้องตามที่กล่าวไว้ในวรรคก่อนหน้าของฉัน นอกจากนี้ที่นี่คุณกำลังใช้/dev/nullเป็นแฟ้มใส่ไปcommandตัวอย่างเช่นถ้าคำสั่งคือคุณจะใช้มันเป็นcatcat /dev/null

คำสั่งในจุดที่ 5 ของคุณไม่ได้ถูกใส่อย่างถูกต้องคุณใช้nohup <command> & disownในขณะที่ใช้อย่างใดอย่างหนึ่งnohupหรือdisownอย่างอื่นไม่จำเป็น วัตถุประสงค์ของพวกเขาเหมือนกัน (เพื่อเพิกเฉยSIGHUP) แต่พวกเขาทำงานในลักษณะที่แตกต่างกันเล็กน้อย nohup <command> &ดังนั้นคำสั่งได้ง่ายเป็น

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