Ngăn chặn Ubuntu tắt máy trước khi cập nhật nền tự động hoàn tất


21

Tôi đã cài đặt (x) Ubuntu 14.04 trên PC của một người bạn. Cập nhật tự động được đặt thành "tải xuống và cài đặt cập nhật tự động".

Vấn đề là, sau vài tháng sử dụng, anh vô tình tắt PC trước khi gói nâng cấp hoàn tất. Điều đó dẫn đến các gói / gói bị hỏng, dẫn đến việc cập nhật bị ảnh hưởng và nhu cầu chạysudo dpkg --configure -a

Có thể khiến Ubuntu chờ đợi các bản cập nhật hoàn tất trước khi tắt PC hoặc khởi động lại như Windows để đảm bảo rằng sẽ không bao giờ có các gói bị hỏng và PC của anh ta sẽ vẫn được cập nhật tự động?


Bạn đã để PC của bạn afk trong khi tăng? Kiểm tra của bạnSystem Settings -> Power
Tốt

1
Bạn nghĩ gì đang gây ra tắt máy xảy ra? Một hệ điều hành không nên tự tắt một cách ngẫu nhiên, vì đó cũng sẽ là một rủi ro mất dữ liệu. Có lẽ anh ta nhấn nút nguồn hoặc cắt nguồn điện?
thomasrutter

Nó không tắt ngẫu nhiên. Đó là sự lựa chọn của người dùng. Nhưng sau nhiều tháng sử dụng, anh ta đã tắt máy trong khi cập nhật vẫn đang được tiến hành
Giannis

Tôi đang ở trong một ràng buộc tương tự nhưng tệ hơn khi tôi bảo máy chủ của mình khởi động lại một bản nâng cấp xa mà tôi đã tự khởi động (và quên mất). Rõ ràng là lúc đó đang cập nhật grub, vì vậy bây giờ tôi cần sửa nó (không phải là không thể, nhưng tôi mừng vì đây không phải là hệ thống tôi thực sự cần và chạy ngay bây giờ).
LovesTha

Tôi đang viết một kịch bản bash để cố gắng làm điều này, tôi sẽ đăng nó khi tôi hoàn thành.
con mèo

Câu trả lời:


8

Molly-Guard là một chương trình cho chính xác mục đích này; nó yêu cầu bạn thực hiện một số lượng nhỏ thiết lập và có /usr/sbin trước đó /sbin trong của bạn $PATH.

Mặt khác, theo điều này, các chi tiết chính xác phụ thuộc rất nhiều vào việc triển khai GUI / DE. Vì chúng tôi biết bạn của bạn đang sử dụng Xubfox, điều này thu hẹp nó, nhưng không biên dịch lại Xfce với sự hỗ trợ tích hợp này (sẽ tạo ra nhiều vấn đề hơn) có vẻ rất khó khăn.

Theo nghiên cứu tuyệt vời của tôi, về mặt lý thuyết bạn có thể chỉ cần thay thế /sbin/shutdownbằng một kịch bản kiểm tra xem một công việc apt có hoạt động sudo shutdown -chay không hoặc thực hiện sudo init 2tắt máy đang chạy và waitđể nó thoát ra, nhưng tôi không chắc nó mạnh đến mức nào.

Theo đó , bạn chỉ có thể khiến người dùng khó tắt máy, thay vì móc một đoạn script.

Cuối cùng, như được phác thảo ở đây , bạn có thể cài đặt unattended-upgradestrên bất kỳ hệ thống nào bạn đang sử dụng để tự động điền ngay bây giờ và đảm bảo rằng nó thoát ra trước khi tắt máy như chi tiết trong câu trả lời này .


Có nhiều lựa chọn, tất cả đều có mức độ không đáng tin cậy khác nhau, nhưng tôi nghĩ rằng cái tốt nhất, giải quyết những gì tôi nghĩ là, ở một mức độ nào đó, một vấn đề X / Y tiềm ẩn đang diễn ra ở đây, là:

Sử dụng crontabđể làm cho máy tính của mình chạy dpkg --configure -atrên mỗi khởi động.

@LoveTha: Vì mục đích của bạn, tôi khuyên bạn unattended-upgrades, hoặc có lẽ là Molly-Guard.


1
Molly Guard không phải là điều tuyệt vời đối với tôi, tôi thường tắt hộp này bằng cách nhấn nút nguồn. tùy chọn nâng cấp không giám sát trông hợp lý, hy vọng nó hoạt động.
LovesTha

7

Giới thiệu

Kịch bản dưới đây sử dụng bỏ phiếu theo hướng gián đoạn cho các thông báo cụ thể từ dbus và bất cứ khi nào thấy yêu cầu tắt / khởi động lại, nó sẽ kiểm tra xem trình quản lý gói như đang chạy dpkghay aptkhông. Nếu họ đang chạy, yêu cầu tắt máy sẽ bị hủy.

Thiết lập

Vì bạn đã đề cập rằng bạn của bạn không muốn chạm vào dòng lệnh, bạn sẽ cần phải ssh vào máy của anh ấy hoặc đến và cài đặt thủ công.

Cài đặt thủ công

  1. mkdir $HOME/bin
  2. Sao chép nguồn tập lệnh, lưu vào tập tin có tên preventShutdown.sh
  3. Kịch bản phải được thực thi. Sử dụng chmod +x $HOME/bin/preventShutdown.shđể làm điều đó
  4. Thêm tập lệnh vào danh sách các thói quen sẽ được chạy khi đăng nhập vào Unity / Gnome bằng ứng dụng Khởi động ứng dụng hoặc bằng cách đặt .desktoptệp vào thủ công$HOME/.config/autostart

Thiết lập thay thế

sudo apt-get install git
cd /opt
sudo git clone https://github.com/SergKolo/sergrep.git
sudo chmod +x /opt/sergrep/*

Thêm tập lệnh dưới dạng một ứng dụng khởi động.

Nguồn kịch bản

#! /bin/bash

##########################
# AUTHOR: Serg Kolo 
# Date: Saturday, December 26th, 2015
# Description: Script to notify user and prevent 
#   shutdown or reboot
#   if any update or package manager
#   are running. 
# TESTED ON: 14.04.3 LTS, Trusty Tahr
# WRITTEN FOR: http://askubuntu.com/q/702156/295286
# VERSION: 2, removed xdotool, using dbus method
#          changed to C-style of organizing code
#########################

# Copyright (c) 2015 Serg Kolo
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal in 
# the Software without restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 
# the Software, and to permit persons to whom the Software is furnished to do so, 
# subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in all 
# copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

# Uncomment the line bellow if needed for debugging
# set -x
###########################
# VARIABLES
###########################

DISPLAY=:0 # has to be set since we are using notify-send


###########################
# MAIN
###########################
#
#    Basic idea : This runs dbus-monitor which waits for
# "RebootRequested" memberf from com.canonical.Unity.Session ,
# which apprears only when the user clicks the shutdown option 
# from the Unity's top right drop down box. Why RebootRequested ?
# Because this message is guaranteed to pop up once user presses
# the shutdown button.
#   The while loop with read command does the big job.
# dbus-monitor sends initial message , so we want to filter only
# The output that contains the string we need, hence the case...esac
# structure employed here. Once we get the proper message.
# we check whether update-manager or package managers are running
# If there is one instance, then call CancelAction method
# and send notification to the user.
#   Both dbus-monitor and while loop run continuously. This
# can be launcher as script in `/etc/rc.local` or `/etc/rc2.d`
# or preferably (!) in `/etc/xdg/autostart/` . 
#   Here is sample /etc/xdg/autostart/preventShutdown.desktop file
# 
# [Desktop Entry]
# Type=Application
# Name=Prevent-Update
# Exec=/home/$USER/bin/preventShutdown.sh
# OnlyShowIn=GNOME;Unity;
# Terminal=false
# 
# Remember to make this file  as well as script be root-owned with 
# chmod +x /path/to/Script.
# It is preferred to store the script in user's personal $HOME/bin
# folder.
# Make sure to edit $HOME/.profile file to include that into $PATH
# variable

interupt()
{
 qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.CancelAction
 notify-send "<<< UPDATE IN PROGRESS; DO NOT SHUT DOWN>>>"
 wall <<< "<<< UPDATE IN PROGRESS; DO NOT SHUT DOWN>>>"
}

main()
{
 dbus-monitor --profile "interface='com.canonical.Unity.Session',type=signal" |
 while read -r line;
 do
  case "$line" in
   *RebootRequested*)
       pgrep update-manager || pgrep apt-get || pgrep dpkg
    if [ $? -eq 0 ]; then
           interupt
        fi
     ;;
   esac
 done
}

main

+1: Đây chính xác là những gì tôi sẽ làm trong một kịch bản nhưng tôi nhanh chóng nhận ra nó phức tạp hơn nhiều so với những gì tôi nghi ngờ ban đầu.
mèo

5
  1. Để trích dẫn Einstein:

    Only two things are infinite, the universe and human stupidity, 
    and I'm not sure about the former.
    

    do đó, không có bảo hành 100% chống lại sự ngu ngốc của con người, nhưng bạn có thể khiến những người không-Einsteins khó phá vỡ mọi thứ bằng cách:

  2. Kích hoạt cập nhật tự động khi tắt máy .

  3. Giải thích rằng máy tính không phải là búa, cũng không phải đinh mà là những thiết bị thông minh, dễ vỡ cần hai loại thực phẩm: điện và cập nhật.

Ngoài ra,

  1. Dừng cập nhật tự động hoàn toàn và bắt đầu bằng cách truy cập bạn bè của bạn thường xuyên hơn và tự cài đặt các bản cập nhật cho anh ấy / cô ấy.
  2. Yêu cầu bia hoặc một bữa ăn ngon để "điều chỉnh" máy tính

Ngoài ra:
• sử dụng Remmina để giúp mọi thứ hoạt động trơn tru


2
Đồng ý 100%. Ngoài ra anh ta có thể thiết lập ssh và cổng chuyển tiếp trên bộ định tuyến để quản lý nó từ xa.
Sergiy Kolodyazhnyy

2
Ít phân biệt giới tính sẽ tốt đẹp.
LovesTha

@LoveTha phân biệt giới tính?
Fabby

8 giờ sau khi tôi để lại bình luận đó, bạn đã chỉnh sửa bài đăng để bớt phân biệt giới tính. Bây giờ hơn hai năm sau bạn gặp khó khăn khi nhớ lại những gì bạn đã viết ban đầu.
LovesTha

@LoveTha Vâng, không phân biệt giới tính nữa ... Đã đến lúc xóa bình luận. :-)
Fabby
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.