ฉันไม่รู้ว่าสิ่งนี้เป็นของ SO หรือไม่ (เพราะเป็นข้อผิดพลาดในการเขียนโค้ด) แต่คิดว่าพวกคุณจะมีความรู้มากขึ้นเกี่ยวกับรายละเอียดปลีกย่อยของซอฟต์แวร์ที่ใช้ (อาจเป็นเพราะคุณอาจพิจารณา U&L)
นี่คือสคริปต์โค้ดขั้นต่ำ (ดูการแก้ไขสคริปต์แบบเต็มมีเหตุผลที่ฉันทำเช่นนี้)
#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
สิ่งที่พยายามทำคือเรียกใช้เซิร์ฟเวอร์ในพื้นหลังซึ่งส่งออกไปยังไฟล์บันทึก
จากนั้นผมล็อกไฟล์ที่ใช้follow less +Fในการออกจากสิ่งนี้คุณต้องกดctrl+ cก่อนจึงจะสามารถกดQได้
จะเกิดอะไรขึ้นเมื่อฉันctrl+ cภายในlessคำสั่ง (หยุดtailing) มันจะฆ่าเซิร์ฟเวอร์ที่เริ่มต้นด้วยnohupที่ด้านบน! ไม่มีอะไรได้รับผลกระทบ ฉันสามารถshift+ fเพื่อเริ่มปรับแต่งบันทึกอีกครั้ง (ซึ่งไม่ได้รับข้อมูลใหม่เนื่องจากเซิร์ฟเวอร์ถูกฆ่าตาย) และถ้าฉันกดQส่วนที่เหลือของสคริปต์ดำเนินการตามปกติ
คุณรู้ไหมว่าทำไมสิ่งนี้ถึงเกิดขึ้น ฉันจะหลีกเลี่ยง / ใช้อย่างอื่นได้อย่างไร
PS
โปรแกรมเซิร์ฟเวอร์อาจกำลังฟัง a ^Cซึ่งอาจเป็นปัญหา มีบางอย่างที่ฉันสามารถทำได้เพื่อหยุดสิ่งนั้น เช่นเมื่อฉันเพิ่งรัน{SERVERCOMMAND}ด้วยตัวเอง (ในลักษณะบล็อก) ฉันสามารถกดctrl+ cซึ่งไม่ฆ่ามันทันที มันพิมพ์Received ^C signal, shutting down(และจากนั้นจะฆ่าตัวเอง) นี่คือสิ่งที่เกิดขึ้นเมื่อฉัน^Cเข้าless(มีการReceived ^C signal, shutting downเขียนขั้นสุดท้ายลงในบันทึก)
PPS
ฉันได้ลองทำหลายอย่างแล้ว (ไม่ทำงาน);
พยายามยกเลิกการเชื่อมต่อ stdin จากสคริปต์โดยเปลี่ยน
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 & to nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 & or nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &ใช้
stty intr ^Gเพื่อแทนที่คำสั่งขัดจังหวะ แต่แล้วctrl+ gก็ทำสิ่งที่^Cทำอยู่แล้ว (ดังนั้นนี่อาจเป็นปัญหากับเทอร์มินัลอีมูเลเตอร์ของฉันแทน;konsole)วาง
nohup& / หรือlessบรรทัดในวงเล็บ (เพื่อให้เป็น subshell)เรียกใช้สคริปต์
xtermแทนkonsole
nohupป้องกันกระบวนการจากการรับSIGHUPสัญญาณในขณะที่ CTRL + C ส่งSIGINTสัญญาณ นั่นเป็นสาเหตุที่nohupไม่มีผลกระทบตามที่คุณคาดหวัง
I think it is due to the handling within the database software, not on the shell. โปรแกรมจะทำเช่นนี้ได้อย่างไร แล้วฉันจะหยุดมันได้อย่างไร