การปิดระบบที่สง่างามใน ArchLinux


21

ฉันกำลังพยายามที่จะปิด / รีบูตที่สง่างามใน ArchLinux ด้วย GNOME Shell ตอนนี้เมื่อฉันขอปิดมันทันทีปิดโดยไม่ต้องให้เวลาโปรแกรมเปิดเพื่อปิด / บันทึกไฟล์ที่เปิดอย่างสง่างาม เป็นผลให้เมื่อใดก็ตามที่ฉันรีสตาร์ท Chrome (เช่น) มันจะบอกฉันว่าเซสชั่นไม่ได้ปิดอย่างถูกต้อง ฯลฯ โดยการอ่านบนเว็บฉันได้เรียนรู้ว่า systemd ในขณะที่ปิดกระบวนการมันก็ส่งSIGTERMตามด้วยSIGKILLถ้ากระบวนการไม่ปิด ด้วยการหมดเวลาที่กำหนด อย่างไรก็ตามฉันสังเกตเห็นว่าในระบบของฉันSIGKILLจะถูกส่งทันทีหลังจากSIGTERMและฉันเดาว่านี่เป็นสาเหตุของการยกเลิกโปรแกรมที่ไม่สง่างาม

ฉันได้พบเอกสารบางอย่างซึ่ง (ถ้าฉันอ่านอย่างถูกต้อง) ระบุว่าการหมดเวลาก่อนที่จะส่งSIGKILLสามารถตั้งค่าได้โดยTimeoutStopSec=ตัวเลือก นอกจากนี้การส่งSIGKILLอาจถูกปิดใช้งานโดยSendSIGKILL=ตัวเลือก แต่ฉันไม่สามารถหาตำแหน่งที่จะกำหนดค่าตัวเลือกเหล่านั้น ... จะมีไฟล์การกำหนดค่าการปิดระบบ / รีบูตที่ฉันสามารถตั้งค่าตัวเลือกเหล่านั้น

แก้ไข:

ฉันทำการทดสอบและพบสิ่งที่น่าสนใจสองอย่าง:

  1. ถ้าฉันปิดโครเมี่ยมด้วยตนเองเช่นนี้killall -SIGTERM chromeมันจะไม่บ่นว่ามันไม่ได้ปิดอย่างถูกต้องในครั้งต่อไปที่ฉันเริ่มมันอีกครั้ง ถ้าฉันปิดมันแบบนี้แทนkillall -SIGKILL chromeมันจะบ่น นี่บอกฉันว่า chrome กำลังจัดการ SIGTERM อย่างถูกต้อง
  2. ดูผลลัพธ์ของโพรซีเดอร์การปิดของฉัน systemd พิมพ์Sending SIGTERM...ตามมาทันทีSending SIGKILL...

ตามความคิดเห็นด้านล่าง systemd จัดการกระบวนการของมันเท่านั้น ดังนั้นในกรณีของฉัน GDM สิ่งนี้บอกฉันว่าปัญหาอาจเป็น:

  1. ทั้ง GDM ไม่ได้ปิดเป็นกระบวนการลูก (เช่น Chrome) อย่างถูกต้อง (เช่นโดยการส่ง SIGTERM ไปให้พวกเขา)
  2. หรือ systemd กำลังส่งข้อความ SIGKILL ไปยัง GDM ก่อนเวลาไม่ให้เวลากับการปิดลูกของมันอย่างถูกต้อง

มีวิธีตรวจสอบ / กำหนดค่าว่า GDM จะปิดลูก ๆ ของมันได้จริง ๆ หรือไม่?


1
Systemd เพียงส่งสัญญาณกระบวนการโดยตรงภายใต้การควบคุมของ สิ่งต่าง ๆ เช่นโครเมียมไม่ใช่กระบวนการอย่างหนึ่ง Systemd จะส่งสัญญาณตัวจัดการการแสดงผลของคุณ (xdm, gdm, kdm, อะไรก็ตาม) มันก็ขึ้นอยู่กับตัวจัดการการแสดงผลที่จะส่งสัญญาณลูก ๆ ของมันและอื่น ๆ ตามลำดับจนกว่าคุณจะได้รับโครเมี่ยม หากไม่มีสัญญาณโครมมันจะตายเมื่อเซิร์ฟเวอร์ xorg ปิดตัวลงและจอแสดงผลจะหายไป
Patrick

@ แพทริก: ขอบคุณฉันเดาอย่างนั้น นั่นเป็นสาเหตุที่ฉันลองเพิ่ม 'TimeoutStopSec = 90s' ในส่วน 'บริการ' ของ '/etc/systemd/system/display-manager.service' ตามนี้: freedesktop.org/software/systemd/man/systemd.service htmlแต่ไม่มีอะไรเปลี่ยนแปลง ... :(
lviggiani

Chrome ควรอยู่ภายใต้systemd'sการควบคุม - systemdคือpid 1- แต่ Chrome เรียกใช้สคริปต์ตัวตัดคำใน subshell และเรียกใช้กระบวนการลูกหลังจากนั้น แต่ถึงกระนั้นก็จะทำในสิ่งที่มันต้องฆ่ามันzygotesตราบเท่าที่ระบบของคุณมีการกำหนดค่าอย่างถูกต้อง คุณกำลังใช้หนึ่งในโซลูชัน temp-space สำหรับ chrome ที่คุณจะพบคำแนะนำใน Arch wiki หรือไม่?
mikeserv

1
ฉันพบปัญหาที่คล้ายกันกับ KDE และ Firefox บน Arch ฉันไม่เคยได้ลองคิดดูว่าทำไม
StrongBad

2
GDM ไม่ใช่กระบวนการส่งสัญญาณ GDM นั้นเป็นวิธีที่โง่มากในการขอ Xorg และ PAM gnome-sessionผู้กระทำผิดที่แท้จริงคือ
strugee

คำตอบ:


2

หากต้องการปิดเดสก์ท็อปของคุณอย่างสง่างามคุณอาจต้องเพิ่มTimeoutStopSec=GDM หรือเครื่องมือจัดการหน้าจออื่น ๆ ที่คุณใช้งานอยู่


ดูเหมือนว่าฉัน GDM ไม่ควรบอกให้ systemd ปิดตัวลงตั้งแต่แรกถ้าไม่ทราบว่าจะปิดไคลเอ็นต์ทั้งหมดหรือไม่
ปริศนานัก

2

สิ่งนี้ใช้ได้กับฉันบน Arch Linux ด้วย Gnome 3.12 ปรากฎว่าอาจเกี่ยวข้องกับการกำหนด/etc/gdm/PostSession/Defaultค่า

  1. รันsudo pacman -S wmctrlเพื่อติดตั้ง wmctrl สำหรับการจัดการ windows

  2. สร้างไฟล์เรียกทำงานเพื่อปิดหน้าต่างทั้งหมด ตัวอย่างเช่นฉันใส่มัน/home/[your_username]/bin/close-all-windowsด้วยเนื้อหาเหล่านี้:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. แก้ไข/etc/gdm/PostSession/Defaultและเพิ่มเนื้อหาเหล่านี้ก่อนexit 0:

    echo " Closing selected windows programs gracefully"
    export DISPLAY=:0
    su [your_username] -c /home/[your_username]/bin/close-all-windows
    

หวังว่าสิ่งเหล่านี้จะได้ผล


สำหรับพลาสมา 5 ให้วางสคริปต์นี้ใน. config / plasma-workspace / shutdown / แก้ปัญหา
AF7

-1

สคริปต์ wmctrl ของ sorpass ใช้งานได้ดีสำหรับฉัน (บน CentOS 7 ฉันต้องเรียกใช้ 'yum install wmctrl' ก่อน) อย่างไรก็ตามฉันพบว่า / etc / gdm / PostSession / Default ดูเหมือนว่าจะทำงานเฉพาะเมื่อออกจากระบบไม่ใช่ปิดเครื่อง ดังนั้นแทนที่จะใช้ / etc / gdm / PostSession / Default ตอนนี้ฉันเรียกสคริปต์ wmctrl ของ sorpass จากสคริปต์ python ของ Seamus Phelan ซึ่งสามารถพบได้ในสองไซต์นี้:

การรวมกันของสคริปต์นี้ใช้งานได้ดีสำหรับการปิด Firefox, Chrome, ฯลฯ โดยอัตโนมัติและหมดจดเมื่อฉันออกจากระบบหรือปิดเครื่องเดสก์ท็อป CentOS 7 ของฉัน โปรดทราบว่าด้วย CentOS 7 คุณต้องเรียกใช้ 'yum install gnome-python2-gnome' เพื่อให้สคริปต์ python นี้ทำงานได้

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