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_xyztendrí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
bashshell.El proceso P1 que emite ese
$indicador está ejecutando actualmente elbashcódigo. Esebashcódigo bifurca un nuevo proceso P2 que se ejecuta/bin/shy 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,envyps.ps(o cualquier otro comando como un script que usaríamos aquí) no tiene forma de saber que ha sido ejecutado por elenvcomando.Todo lo que puede hacer es averiguar cuál es su ID de proceso principal, que en este caso sería P1 o
1si 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>/exeLinux) 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,
script1podrí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 quescript1comenzó. Entonces, siscript1cambia el directorio de trabajo actual antes de llamarscript2,script2obtendrá información incorrecta sobre lo que lo llamó. Por lo tanto, puede ser preferible asegurarse$INVOKERcontenga una ruta absoluta (preferiblemente manteniendo el nombre base) como escribiendoscript1:En los depósitos POSIX,
$PPIDcontendrá 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$PPIDmuere.zshen elzsh/systemmó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,s2yPPIDlos 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 commandpselprocps-ngpaquete, 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.