ฉันควรส่งสัญญาณไปยังกระบวนการปิดระบบอย่างสง่างามในลำดับใด


90

ในความคิดเห็นเกี่ยวกับคำตอบของคำถามอื่นผู้แสดงความคิดเห็นกล่าวว่า:

อย่าใช้ kill -9 เว้นแต่จำเป็นจริงๆ! SIGKILL ไม่สามารถติดกับดักได้ดังนั้นโปรแกรมที่ถูกฆ่าจึงไม่สามารถรันขั้นตอนการปิดระบบใด ๆ เพื่อลบไฟล์ชั่วคราว ขั้นแรกให้ลองใช้ HUP (1) จากนั้น INT (2) จากนั้นจึง QUIT (3)

ฉันเห็นด้วยในหลักการเกี่ยวกับSIGKILLแต่ส่วนที่เหลือเป็นข่าวสำหรับฉัน เนื่องจากสัญญาณเริ่มต้นที่ส่งมาkillคือSIGTERMฉันคาดว่าจะเป็นสัญญาณที่คาดหวังมากที่สุดสำหรับการปิดกระบวนการโดยพลการอย่างสง่างาม นอกจากนี้ฉันพบว่ามีการSIGHUPใช้ด้วยเหตุผลที่ไม่ยุติเช่นการบอก daemon ว่า "อ่านไฟล์ config ของคุณอีกครั้ง" และสำหรับฉันแล้วดูเหมือนว่าSIGINT(การขัดจังหวะแบบเดียวกับที่คุณมักจะได้รับจาก Ctrl-C ใช่ไหม) ไม่ได้รับการสนับสนุนอย่างกว้างขวางเท่าที่ควรหรือยุติอย่างไม่น่าเคารพ

ระบุว่าSIGKILLเป็นทางเลือกสุดท้าย - คุณควรส่งสัญญาณใดและในลำดับใดไปยังกระบวนการตามอำเภอใจเพื่อที่จะปิดมันลงอย่างสง่างามที่สุด

โปรดยืนยันคำตอบของคุณพร้อมข้อมูลสนับสนุน (นอกเหนือจากความชอบส่วนตัวหรือความคิดเห็น) หรือข้อมูลอ้างอิงหากทำได้

หมายเหตุ: ฉันสนใจแนวทางปฏิบัติที่ดีที่สุดซึ่งรวมถึงการพิจารณา bash / Cygwin เป็นพิเศษ

แก้ไข:จนถึงตอนนี้ดูเหมือนจะไม่มีใครพูดถึง INT หรือ QUIT และมีการกล่าวถึง HUP อย่าง จำกัด มีเหตุผลใดบ้างที่จะรวมสิ่งเหล่านี้ไว้ในกระบวนการฆ่าอย่างเป็นระเบียบ?


4
หากคุณต้องใช้ SIGKILL เพื่อฆ่ากระบวนการจริงๆฉันจะถือว่าเป็นบั๊กในโปรแกรม
sigjuice

คำตอบ:


121

SIGTERM บอกให้แอปพลิเคชันยุติการทำงาน สัญญาณอื่น ๆ จะบอกแอปพลิเคชันอื่น ๆ ที่ไม่เกี่ยวข้องกับการปิดระบบ แต่บางครั้งอาจมีผลลัพธ์เหมือนกัน อย่าใช้สิ่งเหล่านั้น หากคุณต้องการให้แอปพลิเคชันปิดการทำงานให้แจ้งให้ทราบ อย่าให้สัญญาณที่ทำให้เข้าใจผิด

บางคนเชื่อว่าวิธีมาตรฐานที่ชาญฉลาดในการยุติกระบวนการคือการส่งสัญญาณไปอย่างมากมายเช่น HUP, INT, TERM และสุดท้ายก็ฆ่า นี่มันไร้สาระ สัญญาณที่เหมาะสมสำหรับการยุติคือ SIGTERM และหาก SIGTERM ไม่ยุติกระบวนการทันทีอย่างที่คุณต้องการนั่นเป็นเพราะแอปพลิเคชันเลือกที่จะจัดการกับสัญญาณ ซึ่งหมายความว่ามีเหตุผลที่ดีมากที่จะไม่ยุติทันที: มีงานล้างข้อมูลที่ต้องทำ หากคุณขัดจังหวะการล้างข้อมูลนั้นจะทำงานร่วมกับสัญญาณอื่น ๆ จะไม่มีการบอกว่าข้อมูลใดจากหน่วยความจำที่ยังไม่ได้บันทึกลงในดิสก์แอปพลิเคชันไคลเอ็นต์ใดที่ค้างอยู่หรือคุณกำลังขัดจังหวะ "กลางประโยค" ซึ่งทำให้ข้อมูลเสียหายอย่างมีประสิทธิภาพ

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความหมายที่แท้จริงของสัญญาณโปรดดู sigaction (2) อย่าสับสนระหว่าง "Default Action" กับ "Description" เพราะไม่ใช่สิ่งเดียวกัน

SIGINT ใช้เพื่อส่งสัญญาณ "แป้นพิมพ์ขัดจังหวะ" แบบโต้ตอบของกระบวนการ บางโปรแกรมอาจจัดการกับสถานการณ์ด้วยวิธีพิเศษสำหรับวัตถุประสงค์ของผู้ใช้เทอร์มินัล

SIGHUP ใช้เพื่อส่งสัญญาณว่าเทอร์มินัลหายไปและไม่ได้ดูกระบวนการอีกต่อไป นั้นคือทั้งหมด. กระบวนการบางอย่างเลือกที่จะปิดเพื่อตอบสนองโดยทั่วไปเนื่องจากการดำเนินการไม่มีเหตุผลหากไม่มีเทอร์มินัลบางกระบวนการเลือกที่จะทำสิ่งอื่นเช่นตรวจสอบไฟล์การกำหนดค่าอีกครั้ง

SIGKILL ใช้เพื่อลบกระบวนการออกจากเคอร์เนลอย่างจริงจัง มีความพิเศษในแง่ที่ว่าจริง ๆ แล้วไม่ใช่สัญญาณของกระบวนการ แต่จะถูกตีความโดยเคอร์เนลโดยตรง

อย่าส่ง SIGKILL SIGKILL ไม่ควรถูกส่งโดยสคริปต์อย่างแน่นอน หากใบสมัครที่จับ SIGTERM ก็สามารถใช้มันสองเพื่อการทำความสะอาดก็สามารถใช้เวลานาทีก็สามารถใช้เวลาหนึ่งชั่วโมง ขึ้นอยู่กับสิ่งที่แอปพลิเคชันต้องทำก่อนที่จะพร้อมสิ้นสุด ตรรกะใด ๆ ที่ " ถือว่า " ลำดับการทำความสะอาดของโปรแกรมได้ดำเนินการนานพอและความต้องการที่จะเป็นทางลัดหรือ SIGKILLed หลังจากวินาที X เป็นเพียงผิดธรรมดา

เหตุผลเดียวที่แอปพลิเคชันต้องใช้ SIGKILL เพื่อยุติการทำงานคือหากมีบางอย่างเกิดข้อผิดพลาดระหว่างลำดับการล้างข้อมูล ในกรณีนี้คุณสามารถเปิดเทอร์มินัลและ SIGKILL ได้ด้วยตนเอง นอกเหนือจากนั้นอีกเหตุผลเดียวที่ทำให้คุณ SIGKILL บางอย่างเป็นเพราะคุณต้องการป้องกันไม่ให้ทำความสะอาดตัวเอง

แม้ว่าคนครึ่งโลกจะส่งซิกคิลสุ่มสี่สุ่มห้าหลังจากผ่านไป 5 วินาที แต่ก็ยังคงเป็นเรื่องที่ผิดอย่างมาก


13
คุณคิดถูกที่มีการใช้ SIGKILL ในทางที่ผิดมากมาย แต่มีเวลาและสถานที่ที่จะใช้แม้กระทั่งจากสคริปต์ แอพจำนวนมากดักจับ SIGTERM และออกอย่างสง่างามในเวลาไม่ถึงหนึ่งวินาทีหรือภายในไม่กี่วินาทีและหนึ่งในนั้นยังคงทำงานในอีก 30 วินาทีต่อมานั่นเป็นเพราะมันถูกแยกออก
dwc

4
@dwc: ลองปล่อยให้มันทำงานหนึ่งครั้งเป็นเวลาหนึ่งชั่วโมง ถ้ามันไม่ตายมันก็ "ลิ่ม" และแก้ไขได้หรือไม่ก็ขี้เกียจและในอนาคต SIGKILL หลังจากนั้นสักครู่ โปรดทราบว่าคุณอาจทำเนื้อหาเสียหายและจำไว้ว่านี่ไม่ใช่สิ่งที่คุณควรทำโดยค่าเริ่มต้น
lhunath

2
@lhunath: หวังว่าคุณจะไม่รังเกียจฉันจัดย่อหน้าของคุณใหม่เพื่อให้คำตอบตรงและชัดเจนยิ่งขึ้นตามจากคำถาม การพูดจาโผงผางต่อต้าน SIGKILL เป็นสิ่งที่ดี แต่เป็นประเด็นรอง ขอขอบคุณอีกครั้งสำหรับคำตอบที่ยอดเยี่ยมและให้ความรู้
ระบบหยุด

8
อย่าส่ง SIGKILL เคย. ผิดธรรมดา จริงๆ? แม้ว่าระบบของคุณจะไหม้อยู่แล้วก็ตามด้วยลูปที่ไม่มีที่สิ้นสุด โชคดี. -1
konsolebox

//, การเพิ่มคะแนนสำหรับสิ่งนี้ไร้สาระ
Nathan Basanese

18

คำตอบสั้น : ส่งSIGTERM30 SIGKILLวินาทีต่อมา นั่นคือส่งSIGTERMรอสักครู่ (อาจแตกต่างกันไปในแต่ละโปรแกรมคุณอาจรู้จักระบบของคุณดีกว่า แต่ 5 ถึง 30 วินาทีก็เพียงพอแล้วเมื่อปิดเครื่องคุณอาจเห็นว่าเครื่องรอโดยอัตโนมัติถึง 1'30 วินาที ทำไมรีบร้อนหลังจากทั้งหมด?) SIGKILLแล้วส่ง

เหมาะสมคำตอบ : SIGTERM, SIGINT, SIGKILL นี้เป็นมากกว่าเพียงพอ กระบวนการที่จะมากSIGKILLอาจจะยุติก่อน

นานคำตอบ : SIGTERM, SIGINT, SIGQUIT, SIGABRT,SIGKILL

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

ไม่ว่าคุณจะเลือกคำตอบใดจากคำอธิบายนี้โปรดจำไว้ว่า!

หากคุณส่งสัญญาณที่มีความหมายอย่างอื่นกระบวนการอาจจัดการด้วยวิธีที่แตกต่างกันมาก (ในแง่หนึ่ง) ในทางกลับกันหากกระบวนการไม่จัดการกับสัญญาณไม่สำคัญว่าคุณจะส่งอะไรไปกระบวนการก็จะหยุดทำงานอยู่ดี (เมื่อการดำเนินการเริ่มต้นสิ้นสุดลงแน่นอน)

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

คำตอบยาวเกือบโง่ :

ตารางร้องประกอบด้วยสัญญาณที่เกี่ยวข้องและการดำเนินการเริ่มต้นในกรณีที่โปรแกรมไม่สามารถจัดการได้

ฉันสั่งพวกเขาตามลำดับที่ฉันแนะนำให้ใช้ (BTW ฉันขอแนะนำให้คุณใช้คำตอบที่สมเหตุสมผลไม่ใช่คำตอบนี้ที่นี่) หากคุณต้องการลองทั้งหมดจริงๆ (มันจะสนุกดีที่จะบอกว่าตารางได้รับคำสั่งในแง่ของ การทำลายล้างที่อาจก่อให้เกิด แต่นั่นไม่เป็นความจริงอย่างสมบูรณ์ )

ไม่แนะนำให้ใช้สัญญาณที่มีเครื่องหมายดอกจัน (*) สิ่งสำคัญเกี่ยวกับสิ่งเหล่านี้คือคุณอาจไม่เคยรู้มาก่อนว่ามีโปรแกรมให้ทำอะไร พิเศษSIGUSR! มันอาจเริ่มต้น apocalipse (เป็นสัญญาณฟรีสำหรับโปรแกรมเมอร์ที่ทำอะไรก็ได้ที่เขา / เธอต้องการ!) แต่หากไม่ได้รับการจัดการหรือในกรณีที่ไม่น่าจะถูกจัดการให้ยุติโปรแกรมจะยุติลง

ในตารางสัญญาณที่มีตัวเลือกเริ่มต้นในการยุติและสร้างการถ่ายโอนข้อมูลหลักจะถูกทิ้งไว้ในตอนท้ายก่อนหน้าSIGKILLนี้

Signal     Value     Action   Comment
----------------------------------------------------------------------
SIGTERM      15       Term    Termination signal
SIGINT        2       Term    Famous CONTROL+C interrupt from keyboard
SIGHUP        1       Term    Disconnected terminal or parent died
SIGPIPE      13       Term    Broken pipe
SIGALRM(*)   14       Term    Timer signal from alarm
SIGUSR2(*)   12       Term    User-defined signal 2
SIGUSR1(*)   10       Term    User-defined signal 1
SIGQUIT       3       Core    CONTRL+\ or quit from keyboard
SIGABRT       6       Core    Abort signal from abort(3)
SIGSEGV      11       Core    Invalid memory reference
SIGILL        4       Core    Illegal Instruction
SIGFPE        8       Core    Floating point exception
SIGKILL       9       Term    Kill signal

แล้วผมจะแนะนำสำหรับการนี้คำตอบยาวเกือบโง่ : SIGTERM, SIGINT, SIGHUP, SIGPIPE, SIGQUIT, SIGABRT,SIGKILL

และสุดท้าย

คำตอบยาว ๆ โง่แน่นอน :

อย่าลองทำที่บ้าน

SIGTERM, SIGINT, SIGHUP, SIGPIPE, SIGALRM, SIGUSR2, SIGUSR1, SIGQUIT, SIGABRT, SIGSEGV, SIGILL, และถ้าไม่มีอะไรทำงานSIGFPESIGKILL

SIGUSR2ควรทดลองใช้ก่อนSIGUSR1เพราะเราจะดีกว่าถ้าโปรแกรมไม่จัดการสัญญาณ และมีแนวโน้มที่จะจัดการได้มากขึ้นSIGUSR1หากจัดการเพียงหนึ่งในนั้น

BTW, the KILL : ไม่ใช่เรื่องผิดที่จะส่งSIGKILLไปยังกระบวนการตามคำตอบอื่น ๆ ที่ระบุไว้ คิดว่าจะเกิดอะไรขึ้นเมื่อคุณส่งshutdownคำสั่ง? มันจะพยายามSIGTERMและSIGKILLเท่านั้น ทำไมคุณถึงคิดว่าเป็นเช่นนั้น? แล้วทำไมคุณถึงต้องการสัญญาณอื่น ๆ ถ้าshutdownคำสั่งvery ใช้แค่สองอย่างนี้?


ตอนนี้กลับไปที่คำตอบยาวนี่คือ oneliner ที่ดี:

for SIG in 15 2 3 6 9 ; do echo $SIG ; echo kill -$SIG $PID || break ; sleep 30 ; done

มันจะหลับเป็นเวลา 30 วินาทีระหว่างสัญญาณ ทำไมคุณถึงต้องการoneliner อีก ? ;)

นอกจากนี้ยังแนะนำ: ลองกับสัญญาณเฉพาะ15 2 9จากคำตอบที่เหมาะสม

ความปลอดภัย : ลบวินาทีechoเมื่อคุณพร้อมที่จะไป ฉันเรียกมันว่าของฉันdry-runสำหรับออนไลเนอร์ ควรใช้เพื่อทดสอบเสมอ


สคริปต์ฆ่าอย่างรุนแรง

จริงๆแล้วฉันรู้สึกทึ่งกับคำถามนี้มากจนตัดสินใจสร้างสคริปต์เล็ก ๆ เพื่อทำสิ่งนั้น โปรดดาวน์โหลด (โคลน) ได้ที่นี่:

ลิงก์ GitHub ไปยังที่เก็บ Killgracefully


8

โดยปกติคุณจะส่งSIGTERMค่าเริ่มต้นของ kill เป็นค่าเริ่มต้นด้วยเหตุผล เฉพาะในกรณีที่โปรแกรมไม่ปิดตัวลงในระยะเวลาที่เหมาะสมคุณควรSIGKILLใช้ แต่โปรดทราบว่าด้วยSIGKILLโปรแกรมไม่มีความเป็นไปได้ที่จะล้างสิ่งต่างๆและข้อมูลอาจเสียหายได้

สำหรับSIGHUP, HUPย่อมาจาก "แขวน" ในอดีตและมีความหมายว่าโมเด็มเชื่อมต่อ โดยพื้นฐานแล้วมันเทียบเท่ากับSIGTERM. เหตุผลที่บางครั้ง daemons ใช้SIGHUPในการรีสตาร์ทหรือรีโหลด config คือ daemons แยกออกจากเทอร์มินัลควบคุมใด ๆ เนื่องจาก daemon ไม่ต้องการสิ่งเหล่านี้และไม่ต้องการรับSIGHUPสัญญาณนั้นจึงถือว่าเป็น "อิสระ" สำหรับการใช้งานทั่วไป ภูตบางตัวไม่ได้ใช้สิ่งนี้ในการโหลดซ้ำ! การดำเนินการเริ่มต้นสำหรับ SIGHUP คือการยุติและภูตจำนวนมากจะทำงานในลักษณะนั้น! ดังนั้นคุณไม่สามารถส่งSIGHUPs ไปยังภูตแบบสุ่มสี่สุ่มห้าและคาดหวังให้พวกมันรอดชีวิตได้

แก้ไข: SIGINTอาจไม่เหมาะสมที่จะยุติกระบวนการเนื่องจากโดยปกติจะเชื่อมโยงกับ^Cหรือการตั้งค่าเทอร์มินัลใดก็ตามเพื่อขัดจังหวะโปรแกรม หลายโปรแกรมจับสิ่งนี้เพื่อจุดประสงค์ของตัวเองดังนั้นจึงเป็นเรื่องปกติที่จะไม่ทำงาน SIGQUITโดยทั่วไปจะมีค่าเริ่มต้นในการสร้างคอร์ดัมพ์และถ้าคุณไม่ต้องการให้ไฟล์คอร์วางอยู่รอบ ๆ ก็ไม่ใช่ตัวเลือกที่ดีเช่นกัน

สรุป: หากคุณส่งSIGTERMและโปรแกรมไม่ตายภายในกรอบเวลาของคุณให้ส่งSIGKILLไป


4
โปรดทราบว่าการติดตามด้วย SIGKILL ควรทำเฉพาะในสถานการณ์ที่การปิดเครื่องทันทีมีความสำคัญสูงกว่าการป้องกันข้อมูลสูญหาย / ข้อมูลเสียหาย
thomasrutter

@dwc ฉันไม่เข้าใจประเด็นต่อไปนี้ในคำตอบของคุณ คุณช่วยได้โปรดช่วย "เหตุผลที่บางครั้ง daemons ใช้ SIGHUP เพื่อรีสตาร์ทหรือโหลดการกำหนดค่าใหม่คือ daemons แยกออกจากเทอร์มินัลการควบคุมใด ๆ ดังนั้นจึงไม่ได้รับ SIGTERM ดังนั้นสัญญาณนั้นจึงถูกพิจารณาว่าเป็น" อิสระ "สำหรับการใช้งานทั่วไป"
แจ็ค

3
@ แจ็คให้ฉันลอง: SIGHUP คือสัญญาณ "วางสาย" ซึ่งบอกกระบวนการที่ว่าเครื่องถูกตัดการเชื่อมต่อ เนื่องจากภูตทำงานอยู่เบื้องหลังจึงไม่จำเป็นต้องมีเทอร์มินัล นั่นหมายความว่าสัญญาณ "วางสาย" ไม่เกี่ยวข้องกับภูต พวกเขาจะไม่ได้รับจากการตัดการเชื่อมต่อเทอร์มินัลเนื่องจากไม่มีการเชื่อมต่อเทอร์มินัลตั้งแต่แรก และเนื่องจากสัญญาณถูกกำหนดไว้แล้วแม้ว่าจะไม่จำเป็นต้องใช้เพื่อจุดประสงค์ดั้งเดิม แต่ daemons จำนวนมากจึงใช้มันแทนเพื่อจุดประสงค์อื่นเช่นการอ่านไฟล์ config ซ้ำ
ระบบ PAUSE

ขอบคุณระบบหยุดชั่วคราว สิ่งนี้มีประโยชน์
แจ็ค

7

SIGTERMที่จริงแล้วหมายถึงการส่งข้อความไปยังแอปพลิเคชัน: " คุณจะใจดีมากถึงขนาดฆ่าตัวตาย " สามารถติดกับดักและจัดการโดยแอพพลิเคชั่นเพื่อเรียกใช้รหัสล้างข้อมูลและปิด

SIGKILLไม่สามารถติดกับแอปพลิเคชันได้ แอปพลิเคชันถูกฆ่าโดย OS โดยไม่มีโอกาสในการล้างข้อมูล

มันเป็นเรื่องปกติที่จะส่งSIGTERMครั้งแรก, SIGKILLการนอนหลับบางเวลาแล้วส่ง


ฉันคิดว่าการสำรวจความคิดเห็นจะมีประสิทธิภาพมากกว่าการนอนหลับเล็กน้อย (ก่อน SIGKILL)
Ohad Schneider

@OhadSchneider จะทำได้ แต่ต้องมีอะไรมากกว่าคำสั่งทุบตีง่ายๆ
vartec

ใช่ผมคิดว่าคุณจะต้องห่วงในขณะที่กระบวนการยังมีชีวิตอยู่โดยใช้อะไรเช่นนี้stackoverflow.com/a/15774758/67824
Ohad Schneider

5
  • SIGTERM เทียบเท่ากับ "การคลิก" X "ในหน้าต่าง
  • SIGTERM คือสิ่งที่ Linux ใช้เป็นอันดับแรกเมื่อปิดตัวลง

นั่นคือสิ่งที่ฉันอยากรู้ +1. ขอบคุณ.
Luc

6
"SIGTERM เทียบเท่ากับ" การคลิกที่ "X" ในหน้าต่าง "ไม่ใช่ไม่ใช่เพราะแอปพลิเคชันใด ๆ สามารถเปิดหน้าต่าง (เอกสารและเครื่องมือเป็นต้น) จำนวนเท่าใดก็ได้อย่างง่ายดายนับประสาอะไรกับกล่องโต้ตอบและอาจไม่ แม้กระทั่งตอบสนองต่อคำสั่งปิดหน้าต่างสุดท้ายเช่นเดียวกับคำสั่ง exit (ฉันไม่สามารถนึกถึงตัวอย่างที่ชัดเจนได้ แต่ในขณะที่ไม่ชัดเจนก็ไม่มีเหตุผลว่าทำไมจึงไม่สามารถทำเช่นนั้นได้) SIGTERM (หรือควรจะ) เทียบเท่ากับการขอให้แอปพลิเคชันยุติอย่างสง่างามอย่างไรก็ตามอาจดำเนินการในแอปพลิเคชันนั้น ๆ
ผู้ใช้

3

เมื่อการสนทนาเกิดขึ้นที่นี่จึงไม่มีการเสนอรหัสใด ๆ นี่คือสิ่งที่ฉันทำ:

#!/bin/bash

$pid = 1234

echo "Killing process $pid..."
kill $pid

waitAttempts=30 
for i in $(seq 1 $waitAttempts)
do
    echo "Checking if process is alive (attempt #$i / $waitAttempts)..."
    sleep 1

    if ps -p $pid > /dev/null
    then
        echo "Process $pid is still running"
    else
        echo "Process $pid has shut down successfully"
        break
    fi
done

if ps -p $pid > /dev/null
then
    echo "Could not shut down process $pid gracefully - killing it forcibly..."
    kill -SIGKILL $pid
fi

0

HUP ฟังดูเหมือนขยะสำหรับฉัน ฉันจะส่งไปให้ daemon เพื่ออ่านคอนฟิกูเรชันอีกครั้ง

SIGTERM สามารถดักจับ; ภูตของคุณอาจมีโค้ดล้างข้อมูลเพื่อให้ทำงานเมื่อได้รับสัญญาณนั้น คุณไม่สามารถทำเช่นนั้นสำหรับ SIGKILL ดังนั้นด้วย SIGKILL คุณไม่ได้ให้ตัวเลือกใด ๆ แก่ผู้เขียนภูต

ข้อมูลเพิ่มเติมเกี่ยวกับวิกิพีเดีย

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