nohup ไม่มีคำสั่ง nousr1 หรือไม่


12

โปรแกรมปกติหลายตัวของฉันทำงานขัดข้อง (เป็นประจำ) พร้อมข้อความ "สัญญาณที่ผู้ใช้กำหนด 1" ฉันรู้ว่ามีnohupคำสั่ง แต่มีnousr1คำสั่งหรือไม่ หรือสิ่งที่จะทำอะไรเช่นnohupแต่กับ USR1?


3
คำถามที่ดีกว่าอาจเป็นสิ่งที่ส่งสัญญาณ usr1 ในตอนแรก? หากไม่มีสิ่งใดข้อความการออกอาจทำให้เข้าใจผิด
แกรนท์

2
ดูเหมือนว่าคุณอาจมีปัญหาร้ายแรงใน "โปรแกรมปกติ" ของคุณ ... เพียงแค่ปิดการใช้งานสัญญาณอาจไม่ถูกต้องหรือทำให้แอพพลิเคชั่นพื้นฐานทำงานได้อย่างถูกต้อง ฉันขอแนะนำอย่างยิ่งให้คุณตรวจสอบสภาพแวดล้อมของคุณอย่างรอบคอบก่อนที่จะปิดใช้งานสิ่งต่าง ๆ
mdpc

@ Grant: ฉันเห็นด้วย มียูทิลิตี้ที่สามารถบอกฉันว่ามีการส่งสัญญาณเหล่านี้หรือไม่?
user2624632

คำตอบ:


3

วิธีแฮ็กที่เรียบง่ายที่มียูทิลิตี้คล้ายกับnohupแต่สำหรับSIGUSR1จะได้รับสำเนาของคอร์ที่เป็นแหล่งcoreutilsแกะมันทำ

sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c

หรือไม่ก็เลือกเปลี่ยนชื่อไฟล์เอาต์พุต

sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c

คอมไพล์ซอร์สนี้และติดตั้งnohupไบนารีที่คอมไพล์ใหม่เพื่อ/usr/bin/nousr1:

cp /path/to/coreutils/src/nohup /usr/bin/nousr1

หลังจากนี้เมื่อฉันตรวจสอบให้sleep 1000ออกในUSR1ขณะที่nousr1 sleep 1000ภูมิคุ้มกันสัญญาณนี้


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

@SimonRichter หากคุณลบsignal(SIGHUP,SIG_IGN);การโทรในกระบวนการที่จะได้รับnohup.c SIGHUPสิ่งที่nohupนอกเหนือจากการเพิกเฉยสัญญาณเป็นเพียงการเปิด stdin, stdout, stderr descriptors อีกครั้งเป็นไฟล์ที่ไม่ใช่เทอร์มินัล มันไม่ได้ยกเลิกการเชื่อมโยงกระบวนการจากเทอร์มินัลด้วยวิธีพิเศษใด ๆ นั่นคือกระบวนการจะถูกส่งSIGHUPเมื่อสถานีวางสาย ในอีกด้านหนึ่งมีทุบตีซึ่งทำสิ่งที่คล้ายกันกับdisownคำสั่ง แต่ฉันไม่แน่ใจว่ามันจะถูกนำไปใช้อย่างไร - อาจเป็นในแบบที่คุณหมายถึง
Ruslan

ดูเหมือนว่าจะทำงานได้ดี
user2624632

8

วิธีการเกี่ยวกับtrapคำสั่งในตัวเชลล์?

trap 'echo "Thou shalt not USR1 me"' USR1 

ความคิดที่ดี แต่มันใช้งานไม่ได้ กระบวนการออกไปแล้วด้วย "สัญญาณที่ผู้ใช้กำหนด 1"
2624632

ตัวจัดการสัญญาณ (นอกเหนือจาก SIG_IGN และ SIG_DFL) ไม่ได้รับการสืบทอดโดยกระบวนการลูก
aecolley

2

คุณต้องใช้รูปแบบของtrapคำสั่งด้วยอาร์กิวเมนต์ว่าง ลองสิ่งนี้:

trap '' SIGUSR1; myprogram

สิ่งนี้จะไม่สนใจสัญญาณ SIGUSR1 ซึ่งเป็นสิ่งที่คุณพยายามทำ แม้ว่าฉันจะเห็นด้วยกับผู้แสดงความคิดเห็นว่าอาจจะเกิดขึ้นที่นี่มากกว่าตรงตา

แบบฟอร์มไม่ถูกต้อง:

trap 'echo ...' SIGUSR1; myprogram

จะยังคงอนุญาตให้myprogramรับ SIGUSR1 แต่เชลล์จะดำเนินechoการtrapคำสั่งจาก


ดูเหมือนว่าจะทำงานได้ดี
user2624632

โอ๊ะฉันพูดเร็วเกินไป ฉันทำงานtrap '' SIGUSR1; gvimdiff file1 file2แล้ว Vim ก็ตายด้วย "Vim: จับสัญญาณมฤตยู USR1"
2624632

อืมมองไปที่ซอร์สโค้ดที่code.google.com/p/vim/source/browse/src/os_unix.cดูเหมือนว่า VIM จะเปิดใช้งานสัญญาณ USR1 อีกครั้งและถือเป็นข้อผิดพลาดร้ายแรง ความหวังเดียวของคุณน่าจะเป็นถ้าคุณสามารถทำให้ระบบปฏิบัติการปฏิเสธที่จะส่งสัญญาณ USR1 ฉันไม่รู้ว่ามีบางอย่างที่สามารถใช้งานได้หรือไม่
Adrian Pronk

ข้อมูลเพิ่มเติมที่นี่: stackoverflow.com/q/4515274/41861
Adrian Pronk

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