Experimente começar com strace . Quando um programa chama outro, ele usa uma das chamadas do sistema exec
. Por exemplo, dado o seguinte script ruby:
#!/usr/bin/env ruby
system("ls")
system("df")
Eu posso grep strace
output para descobrir quais executáveis ele executa:
$ strace -f ./test.rb 2>&1 | grep exec
execve("./test.rb", ["./test.rb"], [/* 23 vars */]) = 0
execve("/opt/opscode/embedded/bin/ruby", ["ruby", "./test.rb"], [/* 23 vars */]) = 0
[pid 7696] read(5, "ame+. If the +exec_name+\n # is"..., 8192) = 8192
[pid 7698] execve("/bin/ls", ["ls"], [/* 23 vars */] <unfinished ...>
[pid 7698] <... execve resumed> ) = 0
[pid 7700] execve("/bin/df", ["df"], [/* 23 vars */] <unfinished ...>
[pid 7700] <... execve resumed> ) = 0
O -f
garante que o strace também rastreie os processos filhos. No começo, você pode ver o shell executando meu script e o interpretador de ruby. Então podemos ver que este script também executa / bin / ls e / bin / df. Observe que esse método mostrará apenas os executáveis que são usados no tempo de execução, não todos os executáveis que podem ter sido usados se o estado do tempo de execução tiver sido diferente.