
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:
- O $PPID fornece o ID do processo pai (o chamador)
- oobs:comando lista todos os processos
- Ogrepcomando procura a linha que contém o PPID no início da linha
- 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 ps
comando.
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 -p
restrição é a ps
saída para o ID do processo do pai. O -o
permite 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 ps
as informações que deseja.
Depois de ter o, $PPID
você também pode procurar em /proc/$PPID/
"dirs" para obter informações mais detalhadas.