ฉันไม่รู้ว่าสิ่งนี้เป็นของ 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
. โปรแกรมจะทำเช่นนี้ได้อย่างไร แล้วฉันจะหยุดมันได้อย่างไร