Impedire l'arresto di Ubuntu prima del completamento degli aggiornamenti automatici in background


21

Ho installato un (x) Ubuntu 14.04 sul PC di un amico. Gli aggiornamenti automatici sono impostati su "download e aggiornamenti di installazione automatica".

Il problema è che, dopo alcuni mesi di utilizzo, spegne inconsapevolmente il suo PC prima che l'aggiornamento dei pacchetti sia completo. Ciò porta a dipendenze / pacchetti rotti, il che comporta l'aggiornamento dell'aggiornamento e la necessità di essere eseguitisudo dpkg --configure -a

È possibile far sì che Ubuntu attenda il completamento degli aggiornamenti prima dello spegnimento del PC o il riavvio come fa Windows per garantire che non ci saranno mai pacchetti rotti e che il suo PC rimarrà automaticamente aggiornato?


Hai lasciato che il tuo PC si accendesse durante l'upgrade ?. Controlla il tuoSystem Settings -> Power
BeGood

1
Cosa pensi stia causando gli arresti? Un sistema operativo non dovrebbe solo arrestarsi casualmente da solo, poiché ciò costituirebbe anche un rischio di perdita di dati. Sta forse premendo il pulsante di accensione o interrompe l'alimentazione?
thomasrutter,

Non si arresta in modo casuale. È una scelta dell'utente. Ma dopo molti mesi di utilizzo capita di spegnere il pc mentre l'aggiornamento è ancora in corso
Giannis

Sono in un legame simile ma peggio quando ho detto al mio server di riavviare durante un aggiornamento dist che avevo avviato manualmente (e dimenticato). È chiaro che al momento era in fase di aggiornamento di grub, quindi ora ho bisogno di risolverlo (non impossibile, ma sono contento che questo non sia un sistema di cui ho davvero bisogno e funzionante in questo momento).
Ama il

Sto scrivendo uno script bash per provare a farlo, lo posterò quando avrò finito.
cat

Risposte:


8

Molly-Guard è un programma proprio per questo scopo; richiede di eseguire una piccola quantità di configurazione e di averlo /usr/sbin prima /sbin nel proprio $PATH.

Altrimenti, secondo questo, i dettagli esatti dipendono fortemente dall'implementazione della GUI / DE. Poiché sappiamo che il tuo amico sta usando Xubuntu, questo lo restringe, ma senza ricompilare Xfce con questo supporto integrato (che creerebbe ulteriori problemi) sembra molto difficile.

Secondo la mia ricca ricerca, teoricamente puoi semplicemente sostituire /sbin/shutdowncon uno script che controlla se un lavoro apt è attivo ed esegue sudo shutdown -co sudo init 2per annullare un arresto in esecuzione e waitper farlo uscire, ma non sono sicuro di quanto sia robusto.

In base a ciò , potresti semplicemente rendere difficile l' arresto dell'utente , invece di collegare uno script.

Infine, come indicato qui , è possibile installare unattended-upgradessu qualsiasi sistema che si sta utilizzando per gli aggiornamenti automatici ora e assicurarsi che esca prima dell'arresto, come dettagliato in questa risposta .


Ci sono molte opzioni, tutte con livelli variabili di inaffidabilità, ma penso che la migliore, che risolva ciò che penso sia, in una certa misura, un problema X / Y sottostante in gioco qui, è questa:

Utilizzare crontabper far funzionare dpkg --configure -ail suo computer ad ogni avvio.

@LovesTha: per il tuo scopo, ti consiglio unattended-upgrades, o forse Molly-Guard.


1
Molly Guard non è poi così eccezionale per me, normalmente spengo questa scatola premendo il pulsante di accensione. le opzioni di aggiornamento automatico sembrano ragionevoli, si spera che funzioni.
Ama il

7

introduzione

Il muggito dello script utilizza il polling basato sull'interruzione per messaggi specifici da dbus e ogni volta che vede una richiesta di arresto / riavvio, verificherà se un gestore di pacchetti come dpkgo aptè in esecuzione. Se sono in esecuzione, la richiesta di arresto verrà annullata.

Impostare

Dato che hai detto che il tuo amico non vuole toccare la riga di comando, dovrai o ssh nel suo computer, o venire e installarlo manualmente.

Installazione manuale

  1. mkdir $HOME/bin
  2. Copia l'origine dello script, salva nel file denominato preventShutdown.sh
  3. Lo script deve essere eseguibile. Usa chmod +x $HOME/bin/preventShutdown.shper farlo
  4. Aggiungi uno script all'elenco delle routine da eseguire all'accesso a Unity / Gnome utilizzando l'app Startup Applications o inserendo manualmente un .desktopfile in$HOME/.config/autostart

Installazione alternativa

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

Aggiungi lo script come applicazione di avvio.

Fonte dello script

#! /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: Questo è esattamente quello che stavo per fare in una sceneggiatura, ma ho subito capito che era molto più complesso di quanto sospettassi inizialmente.
cat

5
  1. Per citare Einstein:

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

    quindi non esiste una garanzia al 100% contro la stupidità umana, ma puoi rendere più difficile per i non-Einsteins rompere le cose:

  2. Attivazione degli aggiornamenti automatici allo spegnimento .

  3. Spiega che i computer non sono martelli, né chiodi, ma pezzi fragili e intelligenti di apparecchiature che richiedono due tipi di cibo: elettricità e aggiornamenti.

In alternativa,

  1. Interrompi del tutto gli aggiornamenti automatici e inizia visitando il tuo amico più spesso e installa gli aggiornamenti per te stesso.
  2. Chiedi birre o un buon pasto per "sintonizzare" il computer

In alternativa:
• utilizzare Remmina per mantenere le cose senza intoppi


2
100% concordato. Inoltre potrebbe configurare ssh e port forwarding sul router per gestirlo da remoto.
Sergiy Kolodyazhnyy,

2
Meno sessismo sarebbe bello.
Ama il

@LovesTha che sessismo?
Fabby,

8 ore dopo che ho lasciato quel commento, hai modificato il post per renderlo molto meno sessista. Ora, più di due anni dopo, hai difficoltà a ricordare ciò che hai scritto in origine.
Ama il

@LovesTha Sì, non più sessista ... È ora di rimuovere il commento. :-)
Fabby
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.