Verhindern Sie, dass Ubuntu heruntergefahren wird, bevor die automatischen Updates im Hintergrund abgeschlossen sind

21

Ich habe ein (x) Ubuntu 14.04 auf dem PC eines Freundes installiert. Automatische Updates sind auf "Updates herunterladen und automatisch installieren" eingestellt.

Das Problem ist, dass er nach einigen Monaten der Nutzung seinen PC unwissentlich herunterfährt, bevor das Upgrade der Pakete abgeschlossen ist. Dies führt zu fehlerhaften Abhängigkeiten / Paketen, was dazu führt, dass Aktualisierungen betroffen sind und ausgeführt werden müssensudo dpkg --configure -a

Kann Ubuntu warten, bis die Updates abgeschlossen sind, bevor der PC heruntergefahren oder neu gestartet wird, um sicherzustellen, dass keine Pakete beschädigt werden und sein PC automatisch aktualisiert wird?

Giannis
quelle
Haben Sie Ihren PC während des Upgrades laufen lassen? Überprüfen Sie IhreSystem Settings -> Power
BeGood
1
Was veranlasst Ihrer Meinung nach die Abschaltungen? Ein Betriebssystem sollte nicht nur nach dem Zufallsprinzip heruntergefahren werden, da dies auch ein Datenverlustrisiko darstellt. Drückt er vielleicht den Netzschalter oder schneidet er das Stromnetz ab?
Thomasrutter
Es wird nicht zufällig heruntergefahren. Es ist Benutzerwahl. Aber nach vielen Monaten des Gebrauchs fährt er den PC herunter, während das Update noch läuft
Giannis
Ich bin in einer ähnlichen, aber schlimmeren Situation, als ich meinem Server anwies, während eines von mir manuell gestarteten (und vergessenen) Dist-Upgrades neu zu starten. Es ist klar, dass es zu der Zeit in der Mitte der Aktualisierung war, also muss ich das jetzt beheben (nicht unmöglich, aber ich bin froh, dass dies kein System ist, das ich gerade wirklich brauche).
LovesTha
Ich schreibe ein Bash-Skript, um dies zu versuchen. Ich werde es veröffentlichen, wenn ich fertig bin.
Katze

Antworten:

8

Molly-Guard ist ein Programm für genau diesen Zweck; Dazu müssen Sie eine kleine Menge Setup durchführen und haben /usr/sbin zuvor /sbin in Ihrem $PATH.

Ansonsten nach dieser die genauen Details sind stark abhängig von der GUI / DE-Implementierung. Da wir wissen, dass Ihr Freund Xubuntu verwendet, wird es dadurch enger, aber ohne erneutes Kompilieren von Xfce mit dieser integrierten Unterstützung (die weitere Probleme verursachen würde) scheint es sehr schwierig zu sein.

Nach meinen umfangreichen Nachforschungen können Sie theoretisch nur /sbin/shutdownein Skript verwenden, das prüft, ob ein passender Job ausgeführt wird, sudo shutdown -coder sudo init 2um ein laufendes Herunterfahren abzubrechen und waitzu beenden. Ich bin mir jedoch nicht sicher, wie robust dies ist.

Nach diesem , könnten Sie einfach es für schwer machen , den Benutzer zum Herunterfahren, anstatt ein Skripts von Einhaken.

Schließlich können Sie, wie hier beschrieben , unattended-upgradesüber jedes System installieren , das Sie für Autoupdates jetzt verwenden, und sicherstellen, dass es beendet wird, bevor Sie das System herunterfahren, wie in dieser Antwort beschrieben .


Es gibt viele Optionen, die alle unterschiedlich unzuverlässig sind, aber ich denke, die beste, die das löst, was meiner Meinung nach zu einem gewissen Grad ein zugrunde liegendes X / Y-Problem ist, ist folgende:

Verwenden Sie crontabdiese Option , damit sein Computer dpkg --configure -abei jedem Start ausgeführt wird.

@ LovesTha: Für deinen Zweck empfehle ich unattended-upgrades, oder vielleicht Molly-Guard.

Katze
quelle
1
Molly Guard ist nicht so toll für mich. Normalerweise schalte ich diese Box durch Drücken des Ein- / Ausschalters aus. Unbeaufsichtigt-Upgrade-Optionen sehen vernünftig aus, hoffentlich funktioniert es.
LovesTha
7

Einführung

Das unten stehende Skript verwendet eine Interrupt-gesteuerte Abfrage für bestimmte Nachrichten von dbus. Wenn eine Anforderung zum Herunterfahren / Neustarten angezeigt wird, wird geprüft, ob ein Paketmanager wie z. B. dpkgoder aptausgeführt wird. Wenn sie ausgeführt werden, wird die Anforderung zum Herunterfahren abgebrochen.

Installieren

Da Sie erwähnt haben, dass Ihr Freund die Befehlszeile nicht berühren möchte, müssen Sie entweder ssh auf seinem Computer ausführen oder dies manuell installieren.

Manuelle Einrichtung

  1. mkdir $HOME/bin
  2. Kopieren Sie die Skriptquelle und speichern Sie sie in der Datei mit dem Namen preventShutdown.sh
  3. Das Skript muss ausführbar sein. Verwenden Sie chmod +x $HOME/bin/preventShutdown.sh, um das zu tun
  4. Fügen Sie ein Skript zur Liste der Routinen hinzu, die bei der Anmeldung bei Unity / Gnome mithilfe der Startup Applications-App oder durch manuelles Ablegen einer .desktopDatei ausgeführt werden sollen$HOME/.config/autostart

Alternatives Setup

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

Fügen Sie das Skript als Startanwendung hinzu.

Skriptquelle

#! /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
quelle
+1: Genau das wollte ich in einem Skript tun, aber mir wurde schnell klar, dass es weitaus komplexer war, als ich ursprünglich vermutet hatte.
Katze
5
  1. Um Einstein zu zitieren:

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

    Es gibt also keine 100% ige Garantie gegen menschliche Dummheit, aber Sie können es Nicht-Einsteins erschweren, Dinge zu brechen, indem Sie:

  2. Automatische Updates beim Herunterfahren aktivieren .

  3. Erklären Sie, dass Computer keine Hämmer oder Nägel sind, sondern zerbrechliche, intelligente Geräte, die zwei Arten von Lebensmitteln benötigen: Elektrizität und Aktualisierungen.

Alternative,

  1. Stoppen Sie die automatischen Updates vollständig und besuchen Sie Ihren Freund häufiger und installieren Sie die Updates selbst.
  2. Fragen Sie nach Bier oder einem guten Essen, um den Computer zu "stimmen"

Alternativ:
• Verwenden Sie Remmina, um einen reibungslosen Ablauf zu gewährleisten

Fabby
quelle
2
100% stimmten zu. Außerdem konnte er ssh und die Portweiterleitung auf dem Router einrichten, um diese remote zu verwalten.
Sergiy Kolodyazhnyy
2
Weniger Sexismus wäre schön.
LovesTha
@LovesTha welcher Sexismus?
Fabby
8 Stunden nachdem ich diesen Kommentar hinterlassen habe, hast du den Beitrag bearbeitet, um viel weniger sexistisch zu sein. Jetzt, über zwei Jahre später, fällt es Ihnen schwer, sich an das zu erinnern, was Sie ursprünglich geschrieben haben.
LovesTha
@LovesTha Ja, nicht mehr sexistisch ... Zeit, Kommentar zu entfernen. :-)
Fabby