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?
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 &