Aquí hay un poco más de información sobre lo que está sucediendo, desde una perspectiva de bajo nivel de Unix. Es largo y va más allá de lo que has preguntado, pero puede ser interesante para ti o para alguien que pase por esta página.
Si se mira el w
manual del comando ( man w
), dice que "La utilidad w imprime un resumen de la actividad actual en el sistema, incluyendo lo que cada usuario está haciendo". Eso es un poco vago, y un poco engañoso. Específicamente lo que w
hace es informarle sobre los actuales inicios de sesión . Los inicios de sesión se registran en un archivo llamado /var/run/utmpx
. Existen métodos comunes de la biblioteca para actualizar utmpx
para que todos los programas que necesiten registrar o eliminar una entrada utilicen el mismo procedimiento.
w
lee el utmpx
utilizando esas rutinas comunes de la biblioteca y muestra información sobre las sesiones de inicio de sesión actuales, junto con el proceso en primer plano . Una sesión de acceso puede estar haciendo muchas cosas a la vez, pero sólo un programa está en primer plano. Todos los demás están en segundo plano, que es lo que ocurre cuando se pone un &
en su comando o presione control-Z
mientras se ejecuta un programa en un terminal.
Se crea una sesión de inicio de sesión cuando se accede al ordenador en la pantalla incorporada. Si tienes activada la conmutación de usuarios, se registra un inicio de sesión para cada usuario, y permanece activo hasta que se cierra la sesión. Y si se inicia la sesión de forma remota (por ejemplo, con ssh
), se registra una entrada para ello. Cada uno de ellos debe aparecer en w
de la salida.
La mayoría de las aplicaciones de terminal, incluyendo Terminal.app y iTerm, así como xterm
si está usando X11.app, son capaces de crear conchas de entrada en una ventana o pestaña. Cuando creas una nueva ventana en una de estas aplicaciones, puedes obtener otra sesión de inicio de sesión, que aparece como otra línea en w
. Pero estas aplicaciones no necesariamente ¡crear conchas de entrada! El hecho de que una nueva ventana/pestaña sea un shell de inicio de sesión suele controlarse en las preferencias. Por ejemplo, en iTerm2, puedes elegir en Preferencias > Perfiles > General > Comando si quieres lanzar un shell de inicio de sesión o algún otro programa. Si sólo pones "bash" ahí, obtendrás un shell, pero no será un inicio de sesión concha.
¿Cuál es la diferencia? Es sutil, pero es útil conocerla.
Hay una buena discusión sobre las cáscaras de inicio de sesión frente a las cáscaras normales aquí: https://unix.stackexchange.com/questions/38175/difference-between-login-shell-and-non-login-shell . Pero podemos resumir como: un shell de inicio de sesión se inicia como el primer proceso después de que algo establece un inicio de sesión en utmpx
. Un shell que no sea de acceso puede ser ejecutado en cualquier momento por cualquier programa, pero no es el primer proceso después de una entrada en utmpx
. (Más técnicamente, un shell de acceso es el proceso principal de un grupo de procesos. El hecho de que normalmente tenga un utmpx
La entrada es descriptiva, no necesaria).
Si su cáscara es bash
como la mayoría, cada instancia de la misma lee y ejecuta el .bashrc
archivo. Cuando bash
se ejecuta como un shell de inicio de sesión, también lee y ejecuta el .bash_profile
y .profile
archivos. Esos archivos pueden contener instrucciones que deben ocurrir sólo para todas las nuevas sesiones. Eso es lo más práctico que hay que saber sobre los shells de inicio de sesión. Eso, y que los shells de inicio de sesión aparecen en w
.
He aquí un experimento para ilustrarlo. Abre una nueva ventana de Terminal y ejecuta w
. Deberías ver algo como:
11:57 up 7 days, 59 mins, 5 users, load averages: 3.58 3.53 3.91
USER TTY FROM LOGIN@ IDLE WHAT
dgc console - 16Aug18 7days -
dgc s000 - 11:57 - w
s000
es el nombre de la terminal que está ejecutando w
en. Existe en el sistema de archivos en /dev/ttys000
. Normalmente hay una relación de uno a uno entre las conchas de acceso y los terminales, pero no siempre.
Ahora abre una nueva ventana de Terminal. Vuelve a la primera y ejecuta w
de nuevo.
12:09 up 7 days, 1:11, 5 users, load averages: 5.35 4.35 4.05
USER TTY FROM LOGIN@ IDLE WHAT
dgc console - 16Aug18 7days -
dgc s000 - 11:38 - w
dgc s001 - 11:57 - -bash
Se ve un nuevo inicio de sesión en s001
- /dev/ttys001
- que está funcionando -bash
. Ese guión al principio es una convención que le indica que bash se está ejecutando como un shell de inicio de sesión. No hay ningún programa en primer plano en esa terminal, así que w
le muestra el propio caparazón.
Ahora vuelve a tu segunda ventana y ejecuta bash
. ¿Qué espera que ocurra?
12:13 up 7 days, 1:14, 5 users, load averages: 5.61 5.07 4.41
USER TTY FROM LOGIN@ IDLE WHAT
dgc console - 16Aug18 7days -
dgc s000 - 11:38 - w
dgc s001 - 11:57 - bash
El guión ha desaparecido. Eso es porque la misma sesión de inicio de sesión (terminal) está ahora ejecutando, en primer plano, un shell que no es un shell de inicio de sesión. Es un niño del original -bash
. Si vuelves a teclear exit
para salir del bash infantil, verás el -bash
de nuevo.
Por último, hay que tener en cuenta el console
de inicio de sesión. Ese nunca cambiará en el uso ordinario. Es el que ejecuta el sistema de escritorio/ventana normalmente. Si usted enciende su Mac y no iniciar la sesión, pero luego ssh
desde otro ordenador, no verás esa línea en absoluto. Siempre aparecerá inactivo, y siempre parecerá que no está ejecutando nada - excepto con el guión, porque es una sesión de inicio de sesión.
Cuando un programa que creó una sesión de inicio de sesión finaliza ese inicio de sesión, vuelve atrás y elimina la entrada de utmpx
utilizando los métodos comunes de la biblioteca para ello. Y porque utmpx
reside en el /var/run
se elimina automáticamente cada vez que se reinicia el ordenador, por lo que si apagas de repente tu Mac mientras has iniciado sesión, no seguirás viendo inicios de sesión falsos para siempre.