Ubuntu không gửi SIGTERM khi tắt máy


21

Tôi bắt đầu nghi ngờ rằng Ubuntu không nói với các ứng dụng đang chạy rằng nó sẽ ngừng hoạt động để cho phép chúng thoát một cách chính xác mà thay vào đó buộc chúng phải thoát.

Nếu tôi để chrome mở khi tắt, nó báo rằng nó không đóng đúng lần trước khi tôi mở lại sau khi khởi động, LibreOffice không hỏi tôi có muốn lưu tài liệu của mình không và tôi đang tạo một ứng dụng cần chạy một số mã khi thoát nhưng không được phép làm như vậy khi tắt máy tính.

Như tôi đã hiểu, SIGTERM trước tiên được gửi đến tất cả các quy trình để cho phép chúng thoát ra một cách sạch sẽ và nếu chúng không thoát SIGKILL sẽ được gửi để buộc chúng thoát. Có vẻ như Ubuntu hoàn toàn không gửi SIGTERM hoặc không cung cấp cho các ứng dụng đủ thời gian trước khi gửi SIGKILL.

Có một số cách tôi có thể khắc phục điều này?

Tôi đang chạy Ubuntu 16.04 nhưng vấn đề cũng tồn tại trong 15.10. Tôi không thể biết nó có ở đó trước khi tôi bắt đầu sử dụng Ubuntu hay không khi 15.10 là phiên bản mới nhất.

Chỉnh sửa: Tôi sử dụng Unity và tắt máy tính của mình bằng cách nhấn thiết bị ở góc trên cùng bên phải và chọn tắt, mặc dù vấn đề là như nhau nếu chạy sudo halttrong thiết bị đầu cuối.

Chỉnh sửa: Tôi đang quan sát hành vi tương tự khi chỉ đăng xuất. Tôi đoán là tín hiệu được cho là được gửi khi đăng xuất và do đó vấn đề phát sinh khi tắt máy và đăng xuất.


Làm thế nào bạn đang tắt?
terdon

1
Chromium và LibreScript không xử lý SIGTERM theo cách bạn muốn xử lý
Andrea Corbellini

2
Tôi không chắc tôi hiểu ý của bạn. Bạn có nghĩa là họ không xử lý SIGTERM chính xác? Có thể họ không nhưng như tôi đã viết trong câu hỏi của mình, tôi đang làm việc trên một chương trình xử lý SIGTERM nhưng mã đó dường như không bao giờ được chạy. SIGINT trong khi nhấn ctrl + C hoạt động hoàn hảo. Tôi vẫn tin rằng có một số vấn đề liên quan đến Ubuntu thông báo các quá trình đang chạy bị tắt.
GKraft


2
Thật khó chịu khi phải đóng tất cả các ứng dụng theo cách thủ công, và nếu bạn quên một ứng dụng được thu nhỏ thì sao? Nó sẽ không lưu công việc của bạn. Và có rất nhiều quy trình nền mà bạn không thể kiểm soát dễ dàng hoặc không nghĩ tới. Họ sẽ không có cơ hội tự dọn dẹp hoặc cứu bất cứ điều gì họ đang làm.
GKraft

Câu trả lời:


3

Thật không may, nó không hoạt động theo cách này. Nhiều chương trình thực sự có trình xử lý tín hiệu, không chặn tín hiệu để hiển thị hộp thoại xác nhận. Xử lý tín hiệu thường là tối thiểu hoặc thiếu.

Bạn có thể dễ dàng thử nó mà không cần phải tắt máy. Chỉ cần gửi SIGTERM đến quy trình Firefox hoặc LibreScript đang chạy của bạn:

$ pkill firefox

Thông thường, Firefox có thể hỏi bạn có thực sự muốn đóng nó không. Ngoài ra, thường phải mất một lúc để đóng, đặc biệt là khi nó chạy trong một thời gian dài và sử dụng hơn 1 GB RAM - thường mất một phút để quá trình chấm dứt sau khi cửa sổ cuối cùng của nó bị đóng. Không có điều này xảy ra khi bạn gửi SIGTERM, quá trình này sẽ chấm dứt ngay lập tức.

Tuy nhiên, một số môi trường máy tính để bàn đóng tất cả các cửa sổ đang mở trước khi tắt. Không giống như SIGTERM, đóng cửa sổ theo chương trình giống như nhấp vào nút X của cửa sổ đó hoặc Alt+ F4. Đây cũng là điều mà đoạn script trong câu trả lời khác thực hiện - nó sử dụng wmctrl để đóng tất cả các cửa sổ đang mở một cách duyên dáng.

Khi một cửa sổ được đóng lại, chương trình không vội vàng và nó có thể đóng mọi thứ trong cửa sổ đó, ví dụ như các tab đang mở và nó cũng có thể hiển thị một cửa sổ hộp thoại nếu có công việc chưa được lưu. Khi tất cả các cửa sổ đang mở của một ứng dụng đã bị đóng, quá trình này thường kết thúc ngay sau đó.

Vì vậy, nó phụ thuộc vào môi trường máy tính để bàn của bạn (giả sử bạn sử dụng môi trường máy tính để bàn của mình để tắt máy và không sudo poweroff). Ví dụ, KDE nên đợi các cửa sổ đang mở được đóng trước khi tắt, trong khi MATE thì không.

Dòng dưới cùng: Đóng tất cả các cửa sổ đang mở bằng tay trước khi tắt. Hoặc sử dụng môi trường máy tính để bàn chờ tất cả các cửa sổ được đóng lại.


Tôi thấy quá trình tắt máy và xử lý tín hiệu không hoạt động chính xác như tôi nghĩ. Bây giờ tôi đã hiểu nó hoạt động như thế nào và tại sao nó không hoạt động như tôi mong đợi.
GKraft

0

Để biết giá trị của nó, một thời gian trước, tôi đã tìm thấy quy trình này trên diễn đàn 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

}

Bạn có thể gọi nó trong một tập lệnh của riêng bạn để đóng tất cả các ứng dụng đang mở trước khi tắt máy (hoặc khởi động lại).

Vấn đề duy nhất là, nó được tạo ra cho Xfce vì vậy, nó cần những thay đổi mà Unity DE áp đặt. Một chút giúp đỡ từ những người hiểu biết hơn sẽ đến đây để giúp giải quyết vấn đề của OP.


Tôi sẽ không có quyền truy cập vào máy tính của mình trong một vài ngày vì vậy tôi không thể thử ngay cả khi nó được sửa. Có nên thực sự cần thiết để sử dụng một kịch bản như vậy? Tôi nghĩ rằng ubfox shoukd tự xử lý nó.
GKraft

Đã đồng ý. Mặc dù vậy, nó hoạt động hoàn hảo trong Xubfox. Chẳng hạn, tắt máy sẽ chờ vô thời hạn nếu có tài liệu chưa được lưu.
SR

0

Trên thực tế, một phần của tập lệnh đóng tất cả các cửa sổ và không phụ thuộc vào bất kỳ DE cụ thể nào có sẵn trên Ask. Câu trả lời 2 và 3 đặc biệt hữu ích. Chỉ với vài dòng nữa, và bằng cách tạo một trình khởi chạy trong bảng điều khiển hoặc trên máy tính để bàn, bạn có thể đạt được chế độ tắt duyên dáng hoạt động trong DE bạn đang sử dụng.

Làm thế nào để đóng tất cả các cửa sổ mở một cách duyên dáng


Họ có vẻ đầy hứa hẹn. Tôi có thể sẽ kết thúc bằng cách sử dụng một kịch bản tương tự.
GKraft
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.