Rastrear chamada bash do Linux

Rastrear chamada bash do Linux

Eu queria saber se existe uma maneira de rastrear de onde um comando foi executado no Linux.

Por exemplo, se eu chamar um script, existe alguma maneira de rastrear de onde ele foi chamado, como iniciado a partir de um programa ou outro script bash.

Responder1

Se o seu script foi escrito como bash, existe uma variável interna chamada $PPID (abreviação de ID do processo dos pais, eu acho) que você pode usar para descobrir quem chamou seu script. Aqui está um exemplo:

CALLER=$(ps ax | grep "^ *$PPID" | awk '{print $NF}')
echo I was called from $CALLER

Explicação:

  1. O $PPID fornece o ID do processo pai (o chamador)
  2. oobs:comando lista todos os processos
  3. Ogrepcomando procura a linha que contém o PPID no início da linha
  4. Oestranhocomando imprime apenas a última coluna, que é o nome do chamador

Responder2

"Eraexecutar de" é bastante difícil, eu acho, a menos que haja algum registro no executável que foi executado. Se a execução for concluída, provavelmente não resta muito o que investigar.

Se issoésendo executado, você poderá obter informações suficientes sobre o chamador a partir do ID do processo pai (PPID) simplesmente usando ps.

Responder3

Se o processo ainda estiver em execução, você poderá usar a visualização hierárquica (também chamada de floresta ou árvore de processos) oferecida pelo pscomando.

Experimente, por exemplo:

ps xf

E a saída será semelhante a:

 3627 ?        Ss     0:00 /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
 3655 ?        S      0:38  \_ bwm --interface eth0 --download
 3656 ?        S      0:38  \_ bwm --interface eth0 --upload
 3687 ?        S      0:20  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
  574 ?        S      0:00  |   \_ sleep 1
 3713 ?        S      0:00  \_ wmiir read /event
 3714 ?        S      0:00  \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22671 ?        S      0:00      \_ /bin/dash -f /usr/local/etc/wmii-hg/wmiirc
22672 ?        Ss     0:03          \_ xterm
22673 pts/0    Ss+    0:00              \_ bash

Responder4

Uma possível atualização para a resposta do Hai Vu:

ps -p $PPID -o args=

A -prestrição é a pssaída para o ID do processo do pai. O -opermite que você especifique sua própria saída e, neste caso, eu tenho args=qual (para mim me dá o que procuro). A possível atualização é que, em vez de obter muitas informações e depois tentar analisá-las, você está apenas solicitando psas informações que deseja.

Depois de ter o, $PPIDvocê também pode procurar em /proc/$PPID/"dirs" para obter informações mais detalhadas.

informação relacionada