Ubuntu ไม่ส่ง SIGTERM เมื่อปิดเครื่อง


21

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

ถ้าฉันเปิดโครเมี่ยมทิ้งไว้เมื่อปิดเครื่องมันบอกว่ามันไม่ได้ปิดอย่างถูกต้องครั้งสุดท้ายเมื่อฉันเปิดอีกครั้งหลังจากบู๊ต LibreOffice ไม่ถามฉันว่าฉันต้องการบันทึกเอกสารของฉันหรือไม่และฉันกำลังสร้างแอปพลิเคชัน เมื่อออก แต่ไม่ได้รับอนุญาตให้ทำเมื่อปิดเครื่องคอมพิวเตอร์

ดังที่ฉันได้เข้าใจแล้ว SIGTERM จะถูกส่งไปยังกระบวนการทั้งหมดก่อนเพื่อให้พวกเขาออกไปอย่างหมดจดและหากพวกเขาไม่ออกจาก SIGKILL จะถูกส่งไปบังคับให้พวกเขาออก ดูเหมือนว่า Ubuntu จะไม่ส่ง SIGTERM เลยหรือไม่ให้เวลากับแอปพลิเคชันเพียงพอก่อนที่จะส่ง SIGKILL

มีวิธีที่ฉันสามารถแก้ไขได้ไหม

ฉันใช้ Ubuntu 16.04 แต่ปัญหามีอยู่ใน 15.10 เช่นกัน ฉันไม่สามารถบอกได้ว่ามันเคยมีมาก่อนหรือไม่ตั้งแต่ฉันเริ่มใช้ Ubuntu เมื่อ 15.10 เป็นรุ่นล่าสุด

แก้ไข: ฉันใช้ Unity และปิดเครื่องคอมพิวเตอร์โดยกดปุ่มเกียร์ที่มุมบนขวาและเลือกปิดเครื่องแม้ว่าปัญหาจะเหมือนกันหากทำงานsudo haltในเครื่อง

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


คุณเป็นอย่างไรบ้าง
terdon

1
Chromium และ LibreOffice ไม่ได้จัดการ SIGTERM ในแบบที่คุณต้องการให้จัดการ
Andrea Corbellini

2
ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณหมายถึง คุณหมายความว่าพวกเขาจัดการ SIGTERM ไม่ถูกต้องหรือไม่? บางทีพวกเขาอาจจะไม่ได้ แต่อย่างที่ฉันเขียนในคำถามของฉันฉันกำลังทำงานกับโปรแกรมที่จัดการกับ SIGTERM แต่ดูเหมือนว่ารหัสจะไม่ทำงาน SIGINT ขณะกด ctrl + C ทำงานได้อย่างสมบูรณ์ ฉันยังเชื่อว่ามีปัญหาบางอย่างเกี่ยวกับ Ubuntu ที่แจ้งให้ทราบถึงกระบวนการทำงานเมื่อปิดตัวลง
GKraft

1
อาจเกี่ยวข้องกับข้อผิดพลาดนี้: # 1448259 Systemd ไม่ส่ง SIGTERM ก่อนเมื่อปิดเครื่อง ?
JonasCz - Reinstate Monica

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

คำตอบ:


3

น่าเสียดายที่มันใช้งานไม่ได้ด้วยวิธีนี้ หลายโปรแกรมที่มีตัวจัดการสัญญาณอย่าบล็อกสัญญาณเพื่อแสดงกล่องโต้ตอบการยืนยัน การจัดการสัญญาณมักจะน้อยที่สุดหรือหายไป

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

$ pkill firefox

โดยปกติ Firefox อาจถามว่าคุณต้องการปิดมันจริงๆ นอกจากนี้มักจะใช้เวลาสักครู่ในการปิดโดยเฉพาะอย่างยิ่งเมื่อมีการใช้งานเป็นเวลานานและใช้ RAM มากกว่า 1 GB - กระบวนการมักจะใช้เวลาประมาณหนึ่งนาทีในการยกเลิกหลังจากหน้าต่างสุดท้ายถูกปิด ไม่มีสิ่งใดเกิดขึ้นเมื่อคุณส่ง SIGTERM กระบวนการจะถูกยกเลิกทันที

อย่างไรก็ตามบางสภาพแวดล้อมเดสก์ท็อปปิดหน้าต่างที่เปิดอยู่ทั้งหมดก่อนที่จะปิดเครื่อง ซึ่งแตกต่างจาก SIGTERM ปิดหน้าต่างโปรแกรมเป็นเหมือนการคลิกที่ปุ่ม X ของหน้าต่างนั้นหรือ+Alt F4นี่คือสิ่งที่สคริปต์ในคำตอบอื่นทำ - ใช้ wmctrl เพื่อปิดหน้าต่างที่เปิดอยู่ทั้งหมดอย่างสง่างาม

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

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

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


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

0

สำหรับสิ่งที่คุ้มค่าเมื่อไม่นานมานี้ฉันได้พบขั้นตอนนี้ในฟอรัม Manjaro:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

คุณสามารถเรียกมันเป็นสคริปต์ของคุณเองเพื่อปิดแอพที่เปิดอยู่ทั้งหมดก่อนที่จะปิด (หรือรีสตาร์ท)

ปัญหาเดียวที่เกิดขึ้นมันถูกสร้างขึ้นสำหรับ Xfce ดังนั้นจึงต้องการการเปลี่ยนแปลงที่ Unity DE เรียกเก็บ ความช่วยเหลือเล็กน้อยจากใครบางคนที่มีความรู้มากขึ้นจะมาที่นี่เพื่อช่วยแก้ปัญหาของ OP


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

ตกลง มันทำงานได้อย่างสมบูรณ์แบบใน Xubuntu ตัวอย่างเช่นการปิดระบบจะรออย่างไม่มีกำหนดหากมีเอกสารที่ไม่ได้บันทึก
SR

0

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

วิธีปิดหน้าต่างที่เปิดอยู่ทั้งหมดอย่างสง่างาม


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