Tắt máy duyên dáng trong ArchLinux


21

Tôi đang cố gắng để tắt / khởi động lại một cách duyên dáng trong ArchLinux với Gnome Shell. Bây giờ, khi tôi yêu cầu tắt máy, nó sẽ tắt ngay lập tức mà không cho chương trình mở thời gian để đóng / lưu các tệp đang mở một cách duyên dáng. Kết quả là, bất cứ khi nào tôi khởi động lại Chrome (ví dụ), nó sẽ cho tôi biết rằng phiên không được đóng đúng, v.v. Bằng cách đọc trên web tôi đã biết rằng systemd trong khi tắt các quy trình, trước tiên, nó sẽ gửi SIGTERMtheo sau SIGKILLnếu quá trình không đóng hết thời gian chờ Tuy nhiên tôi nhận thấy rằng trên hệ thống của tôi SIGKILLđược gửi ngay sau đó SIGTERMvà tôi đoán đây là nguyên nhân của việc chấm dứt chương trình không duyên dáng.

Tôi đã tìm thấy một số tài liệu (nếu tôi đọc chính xác) nói rằng thời gian chờ trước khi gửi SIGKILLcó thể được đặt theo TimeoutStopSec=tùy chọn. Ngoài ra gửi SIGKILLcũng có thể bị vô hiệu hóa bởi SendSIGKILL=tùy chọn. Nhưng tôi không thể tìm thấy nơi để định cấu hình các tùy chọn đó ... có tệp cấu hình tắt / khởi động lại hệ thống nơi tôi có thể đặt các tùy chọn đó không?

CHỈNH SỬA:

Tôi đã làm một số thử nghiệm và tôi phát hiện ra hai điều thú vị:

  1. Nếu tôi tự đóng chrome như thế này killall -SIGTERM chrome, nó sẽ không phàn nàn rằng nó đã không được đóng đúng vào lần tới khi tôi khởi động lại. Nếu tôi đóng nó như thế này thay vào đó killall -SIGKILL chrome, nó sẽ phàn nàn. Điều này cho tôi biết rằng chrome đang xử lý SIGTERM chính xác.
  2. Nhìn vào đầu ra của quy trình tắt máy của tôi, systemd in Sending SIGTERM...ngay lập tức theo sauSending SIGKILL...

Theo bình luận dưới đây, systemd chỉ xử lý các quy trình của nó. Vì vậy, trong trường hợp của tôi GDM. Điều này cho tôi biết rằng vấn đề có thể là:

  1. hoặc GDM không đóng chính xác các quy trình con của nó (ví dụ Chrome) (nghĩa là bằng cách gửi SIGTERM cho chúng)
  2. hoặc systemd đang gửi tin nhắn SIGKILL cho GDM sớm để không cho nó thời gian đóng chính xác các con của nó.

Có cách nào để kiểm tra / cấu hình cách GDM thực sự đóng con của nó không?


1
Systemd chỉ báo hiệu các quá trình trực tiếp dưới sự kiểm soát của nó. Những thứ như chrome không phải là một trong những quy trình đó. Systemd sẽ báo hiệu cho trình quản lý hiển thị của bạn (xdm, gdm, kdm, bất cứ điều gì), sau đó tùy thuộc vào trình quản lý hiển thị để báo hiệu cho con của nó, và cứ tiếp tục xuống cho đến khi bạn chuyển sang chrome. Nếu không có gì báo hiệu chrome, nó sẽ chết khi máy chủ xorg bị tắt và màn hình sẽ biến mất.
Patrick

@Patrick: cảm ơn, tôi đoán vậy. Đó là lý do tại sao tôi đã thử thêm 'TimeoutStopSec = 90s' vào phần '[Service]' của '/etc/systemd/system/display-manager.service' theo điều này: freedesktop.org/software/systemd/man/systemd.service. html nhưng không có gì thay đổi ... :(
lviggiani

Chrome phải được systemd'skiểm soát - systemdpid 1- nhưng Chrome thực hiện ra khỏi tập lệnh bao bọc của nó trong một lớp con và gọi các quy trình con sau đó. Tuy nhiên, nó sẽ làm những gì nó cần để tiêu diệt zygotesmiễn là hệ thống của bạn được cấu hình đúng. Bạn có đang sử dụng một trong những giải pháp không gian tạm thời cho chrome mà bạn sẽ thấy được đề xuất trong wiki wiki không?
mikeerv

1
Tôi gặp vấn đề tương tự với KDE và Firefox trên Arch. Tôi chưa bao giờ loay hoay tìm hiểu tại sao.
StrongBad

2
GDM không phải là quá trình báo hiệu. GDM về cơ bản là một cách ngu ngốc để kết nối Xorg và PAM. thủ phạm thực sự là gnome-session.
strugee

Câu trả lời:


2

Để tắt máy tính để bàn của bạn một cách duyên dáng, bạn có thể cần phải nâng TimeoutStopSec=cấp cho GDM hoặc bất kỳ trình quản lý hiển thị nào khác mà bạn đang sử dụng.


Dường như với tôi, GDM không bao giờ nên nói với systemd phải đóng cửa ngay từ đầu nếu không biết liệu tất cả các khách hàng có thể bị đóng cửa hay không.
enigmaticPhysicist

2

Điều này làm việc cho tôi trên Arch Linux của tôi với Gnome 3.12. Hóa ra nó có thể liên quan đến cấu hình trong /etc/gdm/PostSession/Default.

  1. Chạy sudo pacman -S wmctrlđể cài đặt wmctrl để quản lý windows.

  2. Tạo một tập tin thực thi để đóng tất cả các cửa sổ. Ví dụ, tôi đặt nó /home/[your_username]/bin/close-all-windowsvới các nội dung sau:

    #!/bin/sh
    wmctrl -l | while read -r line
    do
        wmctrl -c `echo "$line" | sed 's/.*  [0-9]* [your_hostname] //'`
    done
    
  3. Sửa đổi /etc/gdm/PostSession/Defaultvà thêm các nội dung này trước exit 0:

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

Hy vọng những điều này sẽ làm việc.


Đối với Plasma 5, đặt tập lệnh này vào .config / plasma-workspace / shutdown / giải quyết vấn đề
AF7

-1

Tập lệnh wmctrl của sorpass hoạt động tốt với tôi (trên CentOS 7 tôi chỉ phải chạy 'yum install wmctrl' trước). Tuy nhiên tôi thấy rằng / etc / gdm / PostSession / Mặc định dường như chỉ chạy khi đăng xuất, không tắt máy. Do đó, thay vì sử dụng / etc / gdm / PostSession / Mặc định, bây giờ tôi gọi tập lệnh wmctrl của sorpass từ tập lệnh python của Seamus Phelan có thể tìm thấy tại hai trang web này:

Sự kết hợp các tập lệnh này hoạt động tuyệt vời để đóng Firefox, Chrome, v.v ... một cách tự động và sạch sẽ khi tôi đăng xuất hoặc tắt máy tính để bàn CentOS 7 của tôi. Lưu ý rằng với CentOS 7, bạn phải chạy 'yum install gnome-python2-gnome' để tập lệnh python này hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.