Evite que Ubuntu se apague antes de que se completen las actualizaciones automáticas en segundo plano


21

He instalado un (x) Ubuntu 14.04 en la PC de un amigo. Las actualizaciones automáticas están configuradas para "descargar e instalar actualizaciones automáticas".

El problema es que, después de algunos meses de uso, sin saberlo apaga su PC antes de que se complete la actualización de los paquetes. Eso lleva a dependencias / paquetes rotos, lo que lleva a que la actualización se vea afectada y la necesidad de ejecutarsesudo dpkg --configure -a

¿Es posible hacer que Ubuntu espere a que se completen las actualizaciones antes de apagar la PC o reiniciar como lo hace Windows para asegurarse de que nunca habrá paquetes rotos y que su PC permanecerá actualizada automáticamente?


¿Has dejado que tu PC funcione mientras estás en proceso de actualización? Compruebe suSystem Settings -> Power
BeGood

1
¿Qué crees que está causando los apagones? Un sistema operativo no solo debería cerrarse al azar por sí solo, ya que eso también sería un riesgo de pérdida de datos. ¿Tal vez está presionando el botón de encendido o cortando la corriente?
thomasrutter

No se apaga al azar. Es elección del usuario. Pero después de muchos meses de uso, apaga la PC mientras la actualización aún está en progreso
Giannis

Estoy en un enlace similar pero peor ya que le dije a mi servidor que se reiniciara durante una actualización de dist que había iniciado manualmente (y que había olvidado). Está claro que estaba en medio de la actualización de Grub en ese momento, así que ahora necesito arreglar eso (no es imposible, pero me alegro de que este no sea un sistema que realmente necesite en este momento).
LovesTha

Estoy escribiendo un script bash para intentar hacer esto, lo publicaré cuando termine.
gato

Respuestas:


8

Molly-Guard es un programa exactamente para este propósito; requiere que haga una pequeña cantidad de configuración, y que tenga /usr/sbin antes /sbin en su $PATH.

De lo contrario, de acuerdo con esto, los detalles exactos dependen en gran medida de la implementación de la GUI / DE. Como sabemos que su amigo está usando Xubuntu, esto lo reduce, pero sin recompilar Xfce con este soporte incorporado (lo que crearía más problemas) parece muy difícil.

De acuerdo con mi abundante investigación, teóricamente puedes reemplazarlo /sbin/shutdowncon un script que verifica si un trabajo apto está activo y se ejecuta sudo shutdown -co sudo init 2para cancelar un apagado en ejecución y waitpara que salga, pero no estoy seguro de cuán robusto es esto.

De acuerdo con esto , podría dificultar que el usuario se apague, en lugar de enganchar un script.

Finalmente, como se describe aquí , puede instalar unattended-upgradessobre cualquier sistema que esté utilizando para actualizaciones automáticas ahora, y asegurarse de que salga antes del apagado, como se detalla en esta respuesta .


Hay muchas opciones, todas las cuales son niveles variables de poco confiables, pero creo que la mejor, que resuelve lo que creo que es, en cierta medida, un problema X / Y subyacente en juego aquí, es esta:

Úselo crontabpara hacer que su computadora funcione dpkg --configure -aen cada arranque.

@LovesTha: Para su propósito, lo recomiendo unattended-upgrades, o tal vez Molly-Guard.


1
Molly Guard no es tan impresionante para mí, normalmente apago esta caja presionando el botón de encendido. las opciones de actualización desatendida se ven razonables, con suerte funcionará.
LovesTha

7

Introducción

Los usos de la escritura de fuelle dirigida por interrupciones de votación para los mensajes específicos de dbus, y cada vez que ve solicitud de apagado / reinicio, que pondrán a prueba si un gestor de paquetes o no como dpkgo aptse están ejecutando. Si se están ejecutando, se cancelará la solicitud de apagado.

Preparar

Como ha mencionado que su amigo no quiere tocar la línea de comando, deberá ingresar a su máquina o ingresar e instalarlo manualmente.

Configuración manual

  1. mkdir $HOME/bin
  2. Copie la fuente del script, guárdela en el archivo llamado preventShutdown.sh
  3. El script debe ser ejecutable. Use chmod +x $HOME/bin/preventShutdown.shpara hacer eso
  4. Agregue un script a la lista de rutinas que se ejecutarán al iniciar sesión en Unity / Gnome usando la aplicación de aplicaciones de inicio o colocando manualmente un .desktoparchivo en$HOME/.config/autostart

Configuración alternativa

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

Agregue el script como una aplicación de inicio.

Fuente de 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: Esto es exactamente lo que iba a hacer en un guión, pero rápidamente me di cuenta de que era mucho más complejo de lo que originalmente sospeché.
gato

5
  1. Para citar a Einstein:

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

    así que no hay una garantía del 100% contra la estupidez humana, pero puede dificultar que los no Einsteins rompan las cosas al:

  2. Activando actualizaciones automáticas al apagar .

  3. Explique que las computadoras no son martillos ni clavos, sino equipos frágiles e inteligentes que necesitan dos tipos de alimentos: electricidad y actualizaciones.

Alternativamente,

  1. Detenga las actualizaciones automáticas por completo y comience visitando a su amigo con más frecuencia e instale las actualizaciones para él / ella.
  2. Pida cervezas o una buena comida para "sintonizar" la computadora

Alternativamente:
• use Remmina para mantener las cosas funcionando sin problemas


2
100% de acuerdo. También podría configurar ssh y reenvío de puertos en el enrutador para administrarlo de forma remota.
Sergiy Kolodyazhnyy

2
Menos sexismo sería bueno.
LovesTha

@LovesTha ¿qué sexismo?
Fabby

8 horas después de dejar ese comentario, editaste la publicación para que fuera mucho menos sexista. Ahora, más de dos años después, tiene problemas para recordar lo que escribió originalmente.
LovesTha

@LovesTha Sí, ya no es sexista ... Es hora de eliminar el comentario. :-)
Fabby
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.