¿Cómo ejecuto un script en el inicio / cierre de sesión de Unity?

8

Tengo dos scripts, uno para montar algunas carpetas sobre SSHFS, y otro para desmontar.

Me gustaría iniciar el script de montaje cuando se inicia mi escritorio Ubuntu predeterminado (después de iniciar sesión en la consola gráfica), y el script de desmontaje cuando "Salgo ..." de la rueda dentada en la esquina superior derecha de el escritorio.

Por favor, ¿alguien puede decirme cómo lograr esto? ¿Cuáles son los ganchos más convenientes / estándar para ejecutar comandos en el inicio / salida del escritorio?

aSteve
fuente
No espero que el momento sea crítico. Lo que importa es que el primer script se ejecute en un segundo más o menos ... antes de que el usuario inicie aplicaciones de forma interactiva. Al cerrar sesión, solo importa que el segundo script se ejecute antes de que alguien inicie sesión en la consola.
aSteve
Tengo acceso de root. Instalar paquetes no es problema. Si es posible, me gustaría usar solo privilegios a nivel de usuario, suponiendo que haya una forma ordenada de hacerlo. Mis scripts no necesitan root. Estoy buscando asesoramiento sobre la mejor manera de iniciar mis scripts en Unity start / stop ... La mayor parte de mi experiencia en Linux / Unix está en un contexto que no es GUI. Con XWindows de la vieja escuela y un administrador de ventanas vainilla, podría haberlo hecho desde .xinitrc. ¿Cuál es la mejor manera con el escritorio moderno y predeterminado de Unity?
aSteve
No quiero hacer que la acción de cierre de sesión dependa de lo que está / no está montado ... Todo se maneja dinámicamente por los scripts existentes. Lo que necesito es una forma ordenada de ejecutar el primer script al iniciar sesión y el segundo al cerrar sesión para la sesión de la GUI en la consola. He encontrado "Aplicaciones de inicio", pero eso solo resolvería la primera mitad del problema.
aSteve
No creo que las "aplicaciones de inicio de sesión" sean la estrategia correcta para ninguno de los guiones. Tengo dos scripts ... uno configura las cosas para mi sesión de GUI; el otro se limpia después de una sesión de GUI. Ambos deben ejecutarse como el mismo usuario que la sesión GUI. Ninguno de los dos requiere argumentos. Necesito encontrar una manera adecuada de iniciar los scripts; en el momento adecuado, eso es todo. No deberían ser necesarias suposiciones sobre lo que realmente hacen los scripts. Esta pregunta trata sobre cómo conectar eventos que coinciden con el inicio y cierre de sesión de Unity.
aSteve

Respuestas:

9

Teniendo en cuenta su requisito de ejecutar un trabajo cuando inicia sesión en Unity y no para otros inicios de sesión, un trabajo de sesión Upstart parece perfecto.

Es posible que lo hayas notado: los procesos que ejecutas después de un inicio de sesión de GUI están bajo un segundo initproceso. Este inites un inicio de inicio adecuado, y puede iniciar y detener trabajos de sesión en función de los eventos emitidos por él. No se necesitan privilegios de root en absoluto. Mejor aún (o peor dependiendo de la perspectiva), esto aún no es completamente compatible con los sistemas sin cabeza. Un inicio de sesión SSH no inició el inicio del usuario desde una prueba rápida que hice justo ahora.

Para crear un trabajo de sesión, cree un nuevo .confarchivo en ~/.config/upstart. Ese es el directorio primario predeterminado para los trabajos de sesión Upstart ( $XDG_CONFIG_HOME/upstart), créelo si no existe. Aquí hay un ejemplo de trabajo:

tee ~/.config/upstart/myjob.conf <<EOF
description "My job"
start on desktop-start
stop on desktop-end

script 
       firefox 'http://upstart.ubuntu.com/cookbook/#session-job'
end script
EOF

Puedes controlarlo manualmente:

start myjob 
# or
initctl start myjob

Los servicecomandos se utilizan para controlar los trabajos del sistema (aquellos en /etc/init.do /etc/init). Para controlar los trabajos de sesión, es necesario usar el initctlcomando, que se usa para interactuar con Upstart.

Vea man upstart-eventspara más eventos que puede usar.

muru
fuente
No me había dado cuenta ... pero ... estoy de acuerdo: un trabajo de sesión inicial parece perfecto. Probablemente me falta algo obvio ... pero después de haber creado ~ / .config / upstart / myjob.conf (como arriba) cuando ejecuto "service myjob start" obtengo "myjob: servicio no reconocido" ¿Alguna idea?
aSteve
Resuelto: necesitaba usar "start myjob" en lugar de "service myjob start". Otro comando útil fue "initctl list"
aSteve
@aSteve lo siento por eso. Lo corregí,
muru
No hay problema. El enfoque de inicio / sesiones definitivamente se ve bien. Dicho esto, todavía no he identificado la mejor manera de usarlo para ejecutar scripts de inicio y detención separados (de corta duración). ¿Puedo usar solo 1 archivo .conf o necesito 2? ¿Debería ser un "servicio" o una "tarea"? ¿Debo usar pre / post start y pre / post stop? No necesito / quiero que se ejecute un proceso entre inicio y parada ... a menos que, supongo, haya una manera fácil de poner un icono en la barra de herramientas ... aunque eso es, probablemente, exagerado, para mis propósitos.
aSteve
1
Finalmente. Después de mucho hackear ... descubrí que necesito que la tarea de Myendtas se active "al final de la sesión", no "al final del escritorio". Esto es algo contrario a la intuición, pero funciona. (¡Por fin!)
aSteve
1

La solución fue utilizar tareas iniciales. Requerí dos tareas: una disparada cuando el escritorio se inicializa para un usuario; el segundo cuando expira la sesión del usuario. Los siguientes dos scripts me funcionan en Ubuntu 14.04.

En ~ / .config / upstart / desktopOpen.conf

description "Desktop Open Task"
start on desktop-start
task
script
# Commands to mount sshfs go here as shell-script.
end script

En ~ / .config / upstart / desktopClose.conf

description "Desktop Close Task"
start on session-end
task
script
# Commands to unmount sshfs go here as shell-script.
end script

Tengo los dedos cruzados de que estos eventos continuarán cumpliendo los requisitos en futuras versiones de Ubuntu. Pensé que valía la pena publicar mi solución aquí, en caso de que sea útil para otros.

aSteve
fuente
-1

Aquí hay algunas sugerencias para ejecutar un script después de iniciar sesión:

Script de StackOverflow Linux después del arranque : Cliff señala que debe colocar su archivo * .sh en /etc/profile.d.

Si desea ejecutar scripts al inicio, aquí hay algunas sugerencias para eso:

Script de StackOverflow Linux después del arranque : Cliff señala que debe usar /etc/rc.local o crontab.

Higgs
fuente
1
Ninguna de esas opciones se ve 'correcta'. Solo quiero ejecutar el script cuando me conecto / desconecto en el sentido de iniciar / finalizar una sesión de unidad. No quiero ejecutar mis scripts cada vez que hay un nuevo inicio de sesión. Los nuevos inicios de sesión pueden iniciarse de forma remota a través de ssh, etc., pero no quiero que ejecuten el script, ya que no inician una nueva sesión de Unity (en la consola).
2014