En * nix world, ¿hay alguna forma de que el script de shell tenga información sobre qué programa lo ha ejecutado?
Ejemplo:
/path/to/script1 /path/to/script_xyz
en este escenario imaginario, script_xyz
tendría información de ruta ( /path/to/script1
)
o
PID de proceso
de entidad que lo ha ejecutado.
Nota: Tengo curiosidad por las diferentes soluciones y enfoques, no espero que esto sea realmente posible
shell-script
shell
process
debugging
Miloš Đakonović
fuente
fuente
Respuestas:
A menudo hay confusión entre la bifurcación del proceso y la ejecución.
Cuando lo haces en el indicador de un
bash
shell.El proceso P1 que emite ese
$
indicador está ejecutando actualmente elbash
código. Esebash
código bifurca un nuevo proceso P2 que se ejecuta/bin/sh
y luego se ejecuta/usr/bin/env
, que luego se ejecuta/bin/ps
.Así P2 a su vez ha ejecutado el código de
bash
,sh
,env
yps
.ps
(o cualquier otro comando como un script que usaríamos aquí) no tiene forma de saber que ha sido ejecutado por elenv
comando.Todo lo que puede hacer es averiguar cuál es su ID de proceso principal, que en este caso sería P1 o
1
si P1 ha muerto en el intervalo o en Linux otro proceso que se ha designado como un subárea en lugar de1
.Luego puede consultar al sistema qué comando está ejecutando ese proceso actualmente (como con
readlink /proc/<pid>/exe
Linux) o qué argumentos pasaron al último comando que ejecutó (como conps -o args= -p <pid>
).Si desea que su script sepa qué lo invocó, una forma confiable sería que el invocador lo dijera. Eso podría hacerse, por ejemplo, a través de una variable de entorno. Por ejemplo,
script1
podría escribirse como:Y
script2
:$INVOKER
( generalmente ) contendrá una ruta ascript1
. Sin embargo, en algunos casos, puede ser una ruta relativa, y la ruta será relativa al directorio de trabajo actual en el momento en quescript1
comenzó. Entonces, siscript1
cambia el directorio de trabajo actual antes de llamarscript2
,script2
obtendrá información incorrecta sobre lo que lo llamó. Por lo tanto, puede ser preferible asegurarse$INVOKER
contenga una ruta absoluta (preferiblemente manteniendo el nombre base) como escribiendoscript1
:En los depósitos POSIX,
$PPID
contendrá el pid del padre del proceso que ejecutó el shell en el momento de la inicialización de ese shell. Después de eso, como se vio anteriormente, el proceso padre puede cambiar si el proceso de identificación$PPID
muere.zsh
en elzsh/system
módulo, puede consultar el actual pid matriz de la cáscara de corriente (sub-) con$sysparams[ppid]
. En shells POSIX, puede obtener el ppid actual del proceso que ejecutó el intérprete (suponiendo que todavía se esté ejecutando)ps -o ppid= -p "$$"
. Conbash
, puede obtener el ppid del actual (sub) shell conps -o ppid= -p "$BASHPID"
.fuente
Sí, un programa puede saber quién es su padre.
Para ilustrar, creemos dos scripts de bash. El primero informa su PID e inicia el segundo script:
El segundo script informa su ID de proceso, el PID de su padre y la línea de comando utilizada para ejecutar el padre:
Ahora, vamos a ejecutarlo:
Como puede ver, el segundo script conoce, de hecho, el PID de su padre. Usando
ps
, ese PID revela la línea de comando utilizada para invocar al padre.Para una discusión sobre PPID con más profundidad, vea la respuesta de Stéphane Chazelas .
fuente
s1
,s2
yPPID
los valores, pero luego, en múltiples líneas despuésERROR: Unsupported SysV option.
y varias líneas con una explicación adicional y - valor vacío paraParent command
ps
elprocps-ng
paquete, versión 3.3.12. Como sugirió Jasen, es probable que esté utilizando una versión diferente que puede requerir una sintaxis diferente para imprimir la línea de comando de los padres. Tratarps -f | grep $PPID
.