No mundo * nix, existe uma maneira de o shell script ter informações sobre qual programa o executou?
Exemplo:
/path/to/script1 /path/to/script_xyz
nesse cenário imaginário, script_xyz
teria informações de caminho ( /path/to/script1
)
ou
PID do processo
da entidade que o executou.
Nota: Estou curioso sobre diferentes soluções e abordagens, não espero exatamente que isso seja realmente possível
shell-script
shell
process
debugging
Miloš Đakonović
fonte
fonte
Respostas:
Muitas vezes há confusão entre bifurcação e execução de processos.
Quando você faz no prompt de um
bash
shell.O processo P1 que emite esse
$
prompt está atualmente executando obash
código. Essebash
código bifurca um novo processo P2 que executa/bin/sh
e/usr/bin/env
depois executa/bin/ps
.Então P2 , por sua vez código executado
bash
,sh
,env
eps
.ps
(ou qualquer outro comando como um script que usaríamos aqui) não tem como saber que foi executado peloenv
comando.Tudo o que você pode fazer é descobrir qual é o ID do processo pai, que nesse caso seria P1 ou
1
se P1 morreu no intervalo ou no Linux outro processo que foi designado como subreader em vez de1
.Em seguida, ele pode consultar o sistema para saber qual comando esse processo está executando atualmente (como
readlink /proc/<pid>/exe
no Linux) ou quais argumentos foram passados para o último comando executado (como comps -o args= -p <pid>
).Se você deseja que seu script saiba o que o invocou, uma maneira confiável seria pedir ao invocador. Isso pode ser feito, por exemplo, através de uma variável de ambiente. Por exemplo,
script1
poderia ser escrito como:E
script2
:$INVOKER
( geralmente ) conterá um caminho parascript1
. Em alguns casos, pode ser um caminho relativo, e o caminho será relativo ao diretório de trabalho atual no momento em que foiscript1
iniciado. Portanto, sescript1
alterar o diretório de trabalho atual antes de ligarscript2
,script2
obterá informações erradas sobre o que o chamou. Portanto, pode ser preferível garantir que$INVOKER
o caminho seja absoluto (de preferência mantendo o nome da base), escrevendoscript1
como:Nos shells POSIX,
$PPID
conterá o pid do pai do processo que executou o shell no momento da inicialização do shell. Depois disso, como visto acima, o processo pai pode mudar se o processo de identificação$PPID
morrer.zsh
nozsh/system
módulo, pode consultar o actual pid pai do reservatório actual (sub) com$sysparams[ppid]
. Nos shells POSIX, você pode obter o ppid atual do processo que executou o intérprete (assumindo que ele ainda esteja em execução) comps -o ppid= -p "$$"
. Combash
, você pode obter o ppid do (sub) shell atual comps -o ppid= -p "$BASHPID"
.fonte
Sim, um programa pode saber quem é seu pai.
Para ilustrar, vamos criar dois scripts bash. O primeiro relata seu PID e inicia o segundo script:
O segundo script relata seu ID do processo, o PID de seu pai e a linha de comando usada para executar o pai:
Agora, vamos executá-lo:
Como você pode ver, o segundo script, de fato, conhece o PID de seu pai. Usando
ps
, esse PID revela a linha de comando usada para chamar o pai.Para uma discussão mais profunda sobre PPID, consulte a resposta de Stéphane Chazelas .
fonte
s1
,s2
ePPID
valores, mas, em seguida, em várias linhas depoisERROR: Unsupported SysV option.
e várias linhas com explicação adicional e - valor vazio paraParent command
ps
oprocps-ng
pacote, versão 3.3.12. Como Jasen sugeriu, você provavelmente está usando uma versão diferente, que pode exigir uma sintaxe diferente para imprimir a linha de comando dos pais. Tenteps -f | grep $PPID
.