Comprobación de cordura:según tengo entendido, el shell es la interfaz a través de la cual el usuario puede interactuar con el sistema operativo, es decir, ejecutar otros procesos.
Sí, pero un "shell" es específicamente un usuario interfaz, no una interfaz de programación. No se requiere que otros programas interactúen con él; pueden usar directamente las mismas llamadas al sistema para crear nuevos procesos.
Entonces, el shell de la línea de comandos está en el mismo nivel que otros programas, p. administradores de servicios o interfaces gráficas de usuario (shells gráficos).
Aunque el shell (por ejemplo, Bash) es solo otro proceso.
Sí. En sistemas similares a Unix, es un proceso completamente normal y sin privilegios.
¿Hay alguna forma de ejecutar un proceso que no sea un elemento secundario de un proceso de shell?
Desde la perspectiva del usuario:sí, hay varias formas.
-
La mayoría de las conchas tienen un
exec
palabra clave que hace que el nuevo programa reemplace el caparazón (manteniendo el mismo PID y paternidad), que probablemente no sea lo que querías decir, pero técnicamente lo que pediste. -
Las sesiones de escritorio gráfico a menudo se inician sin invocar bash ni ningún otro shell, y esto se aplica automáticamente a las aplicaciones iniciadas a través de los menús gráficos. El padre de la aplicación será el proceso responsable de mostrar el menú (por ejemplo, el administrador de ventanas o el panel).
-
El actualmente popular systemd El sistema init no usa shell en absoluto al iniciar los servicios, por lo que puede definir un .service e iniciarlo; el padre del servicio será init mismo. También tiene una función que permite crear servicios temporales sobre la marcha usando
systemd-run
, con los mismos resultados.
Desde la perspectiva de un programador, solo use el fork()
y execve()
llamadas al sistema para iniciar un nuevo proceso. (Hay detalles específicos del sistema operativo, por ejemplo, fork() podría ser un contenedor para una llamada diferente, pero aún funciona de la misma manera).
De hecho, incluso si el programa quisiera invocar un shell, lo haría creando un nuevo proceso secundario y ejecutando /bin/sh usando el mismo fork+exec. No hay una llamada al sistema especial para ejecutar un shell. (El programador podría usar, por ejemplo, system() al escribir en C, u os.system() en Python, pero aún son solo envoltorios convenientes alrededor de fork/exec.)
Variables de entorno:en bash, hay varios scripts que se ejecutan cuando genera un shell, p. .bashrc, .bash_profile, etc. (depende del tipo de shell:interactivo frente a no interactivo, inicio de sesión frente a no inicio de sesión). Estos scripts definen las variables de entorno. Si hay una forma de ejecutar un proceso independientemente de cualquier shell, ¿de dónde vienen las variables de entorno?
Bueno, a veces no lo hacen. (Es un problema práctico real cuando se trata de hacer que las aplicaciones gráficas recojan las personalizaciones del entorno, dependiendo de cómo se inicie ese entorno gráfico en particular).
Sin embargo, en general, las variables de entorno no exclusivo de los shells CLI. Cada proceso, sin importar cómo se inició (incluido incluso el proceso de inicio), recibe una matriz de cadenas que contienen su línea de comando y una matriz de cadenas que contienen sus variables de entorno. Al iniciar un proceso secundario, puede especificar un entorno diferente o permitir que se herede una copia de su propio entorno.
Entonces, cuando inicia sesión, su shell ya recibe algunas variables de entorno iniciales de su padre. Esos scripts de inicio (bashrc, etc.) son solo un lugar conveniente para que un usuario personalice las variables de entorno que luego heredarán los procesos secundarios del shell.
Muchas partes de esta respuesta también se aplican completamente a Windows; aunque su interfaz gráfica es un poco más compleja, los shells de la CLI (cmd.exe y PowerShell) siguen siendo programas ordinarios que no se usan en absoluto en el funcionamiento normal. La única diferencia importante es que Windows tiene una única llamada "CreateProcess" en lugar de las llamadas separadas "fork + exec" al estilo de Unix.
-
Eso es correcto. En última instancia, el shell realizará el
exec
llamada al sistema, que está disponible en todos los sistemas operativos compatibles con POSIX y, de manera más general, en todos los sistemas operativos similares a Unix, incluido Linux. Otros sistemas operativos tienen conceptos similares. En Linux, elexec
la llamada del sistema finalmente llamará alexecve
función, que es proporcionada por el kernel y hace el trabajo real de cargar el archivo ejecutable y ejecutarlo. -
Sí. Cualquier proceso puede llamar a
exec
, y no necesita ser un "shell". Por ejemplo, cuando inicia un programa haciendo clic en un navegador de sistema de archivos, el software de escritorio es el que realiza elexec
llamar, no hay caparazón. Tenga en cuenta que el proceso se convierte en el elemento secundario del software de escritorio que lo inició. Todos los procesos son hijos de otro proceso, excepto el primero, que se llamainit
y tiene PID 1. Es responsable de configurar el sistema operativo al inicio y ejecutar todos los demás procesos, como los servicios en segundo plano y el inicio de sesión en el escritorio. En Linux hoy en día,systemd
se usa a menudo como elinit
proceso, pero hay otras alternativas. -
Hay varias variantes de
exec
(execl
,execle
, ...) que tienen varios argumentos además del nombre del programa a ejecutar. En última instancia, elexecve
La llamada al sistema toma un nombre de programa, una lista de cadenas que son los argumentos de la línea de comandos y una lista de cadenas que son las variables de entorno. Por ejemplo, al iniciar software desde un navegador de sistema de archivos, las variables de entorno pueden copiarse de las del propio navegador de sistema de archivos, posiblemente modificadas por el navegador de sistema de archivos. Esto depende totalmente de los programadores del navegador del sistema de archivos.
Algunas lecturas adicionales:
- https://en.wikipedia.org/wiki/Exec_(system_call)
- https://en.wikipedia.org/wiki/Fork%E2%80%93exec
- https://man7.org/linux/man-pages/man2/execve.2.html