¿Qué sucede cuando presiono "Apagar" desde la GUI?

15

He estado golpeando mi cabeza contra esto por bastante tiempo. Está relacionado con esta pregunta . Me gustaría saber exactamente qué sucede cuando elijo cerrar mi caja de Linux desde la GUI. Esto parece estar mal documentado (si es que lo está).

Idealmente, espero una respuesta independiente de SO y SO. Salvo eso, estoy interesado en el caso específico de Mandriva 2010.1 y Debian 6.x (Squeeze) y 7.0 (Wheezy) que ejecutan Gnome. (Si estás prestando mucha atención, sí, eso es Gnome 2 y Gnome 3)

Básicamente, me gustaría saber qué comando / secuencia de comandos / secuencia de secuencias de comandos se inicia cuando presiono "Apagar" o "Reiniciar" para poder modificar su comportamiento. Algunas publicaciones en el foro que vi sugieren piratería, /etc/polkit-1/*pero esta estructura de directorio es solo un esqueleto en mi cuadro de Debian (Squeeze), por ejemplo.

¿Alguien puede ayudar?


EDITAR

Lo que he intentado hasta ahora

  • Reemplacé el shutdownejecutable con un script propio. Esto no funciona: cuando presiono shutdownGnome cierra la sesión sin ejecutar mi script.
  • Intenté editar el menú de Gnome 2. Sin alegría: las opciones "Apagar", "Cerrar sesión" y "Bloquear pantalla" no aparecen en el editor de menús.
  • Visto /usr/share/menu, nada útil allí.

Posibles vías para la solución

  • straceing las opciones de GUI (¿es esto posible?)
  • Mirando shutdownel código fuente
  • Mirando gnome-sessionel código fuente

Actualizar

Según mis comentarios sobre la respuesta a continuación, busqué polkitacciones debajo /usr/share/polkit-1/actions/y encontré (en el archivo org.freedesktop.consolekit.policy) una acción llamada org.freedesktop.consolekit.system.stop-multiple-usersque arroja el mensaje

System policy prevents stopping the system when other users are logged in

Estoy pensando (debido a la org.freedesktop.*convención de nomenclatura) que se trata de algún tipo de señal enviada al DM a través de D-BUS. Además, este mensaje aparece cuando se intenta cerrar gráficamente mientras otros usuarios están conectados, por lo que el mecanismo que lo activa debe ser el mismo que se activa cuando se selecciona "Apagar" o "Apagar" desde la GUI.

¿Alguien puede confirmar / refutar? ¿Existe la posibilidad de interceptar de alguna manera esta señal o modificarla?

Joseph R.
fuente
¿Qué estás tratando de lograr? Podría agregar una edición /etc/init.d/rc.localpara llamar a un script cuando se detenga .
depquid
@depquid Lo que estoy tratando de lograr está en mi pregunta anterior a la que me vinculé: estoy tratando de evitar que un usuario que inició sesión localmente bloquee la sesión SSH de otro usuario.
Joseph R.

Respuestas:

9

Depende de su Administrador de pantalla! (es decir, KDM, GDM)

¡Tenga en cuenta que su DM se ejecuta como root! (necesita privilegios de root para ejecutar su proceso de sesión como el usuario que inicia sesión)

Cuando hace clic en apagar en KDE o GNOME, su DE envía una señal a su DM para que se apague o reinicie después de que la sesión haya finalizado. Luego, su DE le dice a cada programa que finalice y una vez que todos los demás procesos han finalizado (o expirado un tiempo de espera), el último proceso de su DE - el proceso de sesión - finaliza.

El proceso de sesión es el primer proceso iniciado en una sesión X11. Cuando se elimina o finaliza, la sesión finaliza. ¿Alguna vez has visto ese xterm cuando ejecutas X sin DE? Ese es un proceso de sesión. Este proceso se llama kdeiniten KDE y gnome-sessionen GNOME.

Una vez que la sesión ha finalizado, el control se devuelve a su DM (que ha estado esperando que finalice el proceso X), y verifica lo que el DE le dijo que hiciera. Si le indica que se apague o reinicie, lo hará. En otro caso, solo comenzará una nueva pantalla de inicio de sesión en X.

Esto también está relacionado con problemas que puede haber tenido en el pasado, ya que algunos DE no pueden apagarse o reiniciarse, solo para desconectarse, cuando se usan en combinación con otros DM.

En cualquier caso, esto no está tan mal documentado. GDM tiene una página manual de un comando que le permite decirle que se apague como dije antes ( gdm-control). KDM también tiene una excelente documentación y tiene una utilidad similar (un poco más compleja) llamada kdmctl.


El apagado y el reinicio son posibles sin PolicyKit, pero PolicyKit sirve para muchos propósitos necesarios en los sistemas actuales, como montar discos sin ser root, suspender o hibernar la computadora. ¡Y tampoco está mal documentado!

Echa un vistazo a esto si quieres saber más sobre qué es PolicyKit y cómo funciona: http://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html

Alicia
fuente
Suena prometedor. Gracias por los enlaces a los documentos. No tengo dudas de que estos manuales son completos y claros, pero bien podrían no haber existido. Su respuesta es la primera vez que he visto al administrador de pantallas mencionado junto con este problema, por lo que no es exactamente de conocimiento común. Intentaré esto y les haré saber ...
Joseph R.
OKAY. gdm-controlNo fue de ayuda. La documentación que proporcionó en PolicyKit parece más prometedora. Investigaré eso y veré si puedo implementar una regla personalizada. Continuará ...
Joseph R.
1
Leí un poco (descremado, más bien) y corrígeme si me equivoco: el DE, cuando se le solicite que cierre, enviará un mensaje al DM a través del polkit en D-BUS. A la espera de la autenticación, la sesión puede finalizarse o se puede revocar la solicitud. Esto se define en una polkitacción llamada org.freedesktop.consolekit.system.stop-multiple-usersen /usr/share/polkit-1/actionsSe establece para revocar la solicitud para usuarios inactivos y auth_admin_keeppara el usuario activo. La pregunta es, ¿qué define esta acción? ¿Qué se ejecuta exactamente?
Joseph R.
@don_crissti Eso lo entiendo ahora. Lo que me interesa es precisamente esta "señal". ¿Cuál es el cliente que lo envía?
Joseph R.
@don_crissti ¿Le gustaría mover este comentario a mi otra pregunta para un seguimiento?
Joseph R.