Cegah Ubuntu dari shutdown sebelum pembaruan otomatis latar belakang selesai

21

Saya telah menginstal (x) Ubuntu 14.04 di PC teman. Pembaruan otomatis diatur ke "unduh dan instal pembaruan otomatis".

Masalahnya adalah, setelah beberapa bulan digunakan, ia tanpa sadar mematikan PC-nya sebelum paket-paket upgrade selesai. Itu mengarah pada dependensi / paket yang rusak, yang menyebabkan pembaruan terpengaruh dan perlu dijalankansudo dpkg --configure -a

Apakah mungkin untuk membuat Ubuntu menunggu pembaruan selesai sebelum PC shutdown atau reboot seperti Windows untuk memastikan bahwa tidak akan ada paket yang rusak dan bahwa PC-nya akan tetap diperbarui secara otomatis?

Giannis
sumber
Sudahkah Anda membiarkan PC Anda menyala saat melakukan upating? Periksa AndaSystem Settings -> Power
BeGood
1
Menurut Anda apa yang menyebabkan shutdown terjadi? OS tidak hanya mematikan secara acak sendiri, karena itu juga akan menjadi risiko kehilangan data. Apakah dia mungkin menekan tombol power atau memotong listrik?
thomasrutter
Itu tidak mematikan secara acak. Itu adalah pilihan pengguna. Tetapi setelah berbulan-bulan penggunaannya, dia kebetulan mematikan komputer itu sementara pembaruan masih berlangsung
Giannis
Saya berada dalam ikatan yang sama tetapi lebih buruk ketika saya mengatakan kepada server saya untuk reboot selama dist-upgrade yang saya mulai secara manual (dan lupa tentang). Sudah jelas bahwa itu di tengah memperbarui grub pada saat itu jadi sekarang saya perlu memperbaikinya (bukan tidak mungkin, tapi saya senang ini bukan sistem yang saya perlukan dan jalankan sekarang).
LovesTha
Saya sedang menulis skrip bash untuk mencoba melakukan ini, saya akan mempostingnya setelah saya selesai.
kucing

Jawaban:

8

Molly-Guard adalah program untuk tujuan ini; itu mengharuskan Anda melakukan sedikit pengaturan, dan memiliki /usr/sbin sebelumnya /sbin di komputer Anda $PATH.

Kalau tidak, menurut hal ini detail yang tepat sangat tergantung pada implementasi GUI / DE. Karena kami tahu teman Anda menggunakan Xubuntu, ini mempersempitnya, tetapi tanpa mengkompilasi ulang Xfce dengan dukungan bawaan (yang akan membuat masalah lebih lanjut) sepertinya sangat sulit.

Menurut penelitian saya yang melimpah, Anda secara teoritis bisa hanya mengganti /sbin/shutdowndengan skrip yang memeriksa apakah pekerjaan yang tepat sudah habis dan mengeksekusi sudo shutdown -catau sudo init 2membatalkan shutdown yang sedang berjalan dan waituntuk itu untuk keluar, tapi saya tidak yakin seberapa kuat ini.

Menurut ini , Anda bisa membuat pengguna sulit untuk mematikan, daripada mengaitkan skrip.

Akhirnya, seperti yang diuraikan di sini , Anda dapat menginstal unattended-upgradeslebih dari sistem apa pun yang Anda gunakan untuk autoupdate sekarang, dan pastikan itu keluar sebelum shutdown seperti yang dijelaskan dalam jawaban ini .


Ada banyak opsi, yang semuanya memiliki tingkat ketidakberdayaan yang berbeda-beda, tetapi saya pikir yang terbaik, yang memecahkan apa yang saya pikir, sampai batas tertentu, Masalah X / Y yang mendasarinya saat bermain di sini, adalah sebagai berikut:

Gunakan crontabuntuk membuat komputernya berjalan dpkg --configure -apada setiap boot.

@LovesTha: Untuk tujuan Anda, saya sarankan unattended-upgrades, atau mungkin Molly-Guard.

kucing
sumber
1
Molly guard tidak terlalu luar biasa bagiku, aku biasanya mematikan kotak ini dengan menekan tombol power. opsi upgrade tanpa pengawasan terlihat masuk akal, semoga berhasil.
LovesTha
7

pengantar

Script di bawah ini menggunakan polling berbasis interupsi untuk pesan tertentu dari dbus, dan setiap kali melihat permintaan untuk shutdown / reboot, itu akan menguji apakah manajer paket seperti dpkgatau aptsedang berjalan. Jika berjalan, permintaan penutupan akan dibatalkan.

Mendirikan

Karena Anda telah menyebutkan bahwa teman Anda tidak ingin menyentuh baris perintah, Anda harus ssh masuk ke mesinnya, atau datang dan menginstal ini secara manual.

Pengaturan manual

  1. mkdir $HOME/bin
  2. Salin sumber skrip, simpan ke file bernama preventShutdown.sh
  3. Skrip harus dapat dieksekusi. Gunakan chmod +x $HOME/bin/preventShutdown.shuntuk melakukan itu
  4. Tambahkan skrip ke daftar rutin yang akan dijalankan saat masuk ke Unity / Gnome menggunakan aplikasi Aplikasi Startup atau dengan secara manual menempatkan .desktopfile ke dalam$HOME/.config/autostart

Pengaturan Alternatif

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

Tambahkan skrip sebagai aplikasi startup.

Sumber Skrip

#! /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
Sergiy Kolodyazhnyy
sumber
+1: Ini persis apa yang akan saya lakukan dalam sebuah skrip tetapi saya segera menyadari itu jauh lebih kompleks daripada yang saya duga sebelumnya.
kucing
5
  1. Mengutip Einstein:

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

    jadi tidak ada garansi 100% terhadap kebodohan manusia, tetapi Anda bisa membuatnya lebih sulit bagi yang bukan-Einstein untuk memecahkan sesuatu dengan:

  2. Mengaktifkan pembaruan otomatis saat dimatikan .

  3. Jelaskan bahwa komputer bukanlah palu, atau paku, melainkan peralatan yang cerdas dan rapuh yang membutuhkan dua jenis makanan: listrik dan pembaruan.

Kalau tidak,

  1. Hentikan pembaruan otomatis sama sekali dan mulai dengan mengunjungi teman Anda lebih sering dan instal pembaruan untuknya sendiri.
  2. Minta bir atau makanan enak untuk "menyetel" komputer

Sebagai alternatif:
• gunakan Remmina untuk menjaga barang-barang berjalan dengan lancar

Fabby
sumber
2
100% setuju. Dia juga bisa mengatur ssh dan port forwarding pada router untuk mengaturnya dari jarak jauh.
Sergiy Kolodyazhnyy
2
Kurang seksisme akan menyenangkan.
LovesTha
@LovesTha seksisme apa?
Fabby
8 jam setelah saya meninggalkan komentar yang Anda edit posting menjadi jauh lebih sedikit seksis. Sekarang lebih dari dua tahun kemudian Anda mengalami kesulitan mengingat apa yang Anda tulis semula.
LovesTha
@LovesTha Ya, bukan seksis lagi ... Saatnya menghapus komentar. :-)
Fabby