it-swarm-es.tech

¿Cómo ejecutar un script interactivo antes del apagado de xserver?

Cada vez que apago o reinicio mi computadora portátil (Ubuntu 14.04), me gustaría ejecutar un script que verifique si introduje mi código más nuevo en mi repositorio de git remoto. Si lo olvidé, abre un terminal, le pide al usuario que ingrese un mensaje de confirmación y empuja los cambios. Ya tengo el guión funcionando.

Ahora estoy buscando una manera de hacer que este script se ejecute automáticamente cuando apago o reinicio, pero antes de que la GUI se cierre.

Mi enfoque hasta ahora es con System V Init (sí, sé que está un poco anticuado):

Copio mi script de inicio con el encabezado LSB a /etc/init.d:

Sudo cp ~/git_checker /etc/init.d/

, cambiar permisos:

Sudo chmod a+x /etc/init.d/git_checker

y configurar escenarios de ejecución:

Sudo update-rc.d /etc/init.d/git_checker defaults

Cuando pruebo este script con Sudo service git_checker start, aparece el error: "Error al analizar argumentos: No se puede abrir la pantalla:"

Al leerlo, descubrí que los scripts de inicio no deberían usarse para abrir terminales (así: su user -c 'x-terminal-emulator -e /home/user/git_check.sh'), porque no se garantiza que el servidor X se ejecute cuando se ejecutan los scripts de inicio.

Entonces, los guiones de inicio parecen ser el camino equivocado. ¿Hay otra manera? Tal vez con advenedizo o systemd?

En el caso de ejecutar el script al inicio del sistema, simplemente puedo ponerlo en las aplicaciones de inicio. ¿Existe algo similar, como cerrar aplicaciones?

2
Oscillon

Creé un pequeño script de monitoreo hace algún tiempo que llamará a una función de interrupción una vez que el script detecte el intento del usuario de apagar la computadora. La pequeña modificación que necesita para su caso específico es cancelar la acción de apagado, ejecutar el script y luego llamar al apagado.

#!/bin/bash

main()
{
  dbus-monitor --profile "interface='com.canonical.Unity.Session',type=signal,member=RebootRequested" | \
  while read -r line;
  do
#   echo $line
     grep -q '.*NameAcquired.*' <<< "$line"  && continue  #  Ignore that first line
    if [ -n "$line"  ];then
       interrupt 
    fi
  done
}

interrupt()
{ 
  # The first command will close the shutdown dialog
  qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.CancelAction
  # place call to your script bellow this comment
  zenity --info --text='Remember to Push changes to git repo'
  # Uncomment line bellow for shutdown
  # qdbus com.canonical.Unity  /com/canonical/Unity/Session com.canonical.Unity.Session.Shutdown

}

main

Este script, por supuesto, debe agregarse como parte de las aplicaciones de inicio o puede crear manualmente un archivo .desktop para él.

NOTE: este script funciona solo con GUI, por lo que si el usuario emite un comando Sudo shutdown -P now, no funcionará. También necesitaría monitorear el comando shutdown a través de otro script usando pgrep shutdown o integrar otra función en el script.

Por ejemplo, en mi script anterior, querría agregar esta función

manual_shutdown_monitor()
{
  while true 
  do
  if pgrep shutdown > /dev/null
  then
      zenity --info --text="GOT MANUAL"
  fi
  sleep 0.25
  done
}

Y luego llame a esa función en main() como este

manual_shutdown_monitor &
1