отслеживание Bash звонков - PullRequest
2 голосов
/ 02 марта 2011

Мне бы хотелось, чтобы скрипт / инструмент понимал C ++ (scitools), который дает обратные трассировки для скрипта master bash, который вызывает:

  • другие скрипты bash
  • Python
  • Java
  • Perl

чтобы я знал, что случилось.

Мне не нужен сложный график, достаточно простого текстового файла.

Что может позволить мне сделать это?

Ответы [ 3 ]

6 голосов
/ 02 марта 2011

Использование set -x или запуск сценария с использованием bash -x будет печатать каждую строку перед ее выполнением (но после подстановки переменных, что может быть полезно, но иногда может быть и неприятно):

bash -x myScript.sh
3 голосов
/ 02 марта 2011

Вы можете использовать strace для отслеживания выполнения вашего скрипта другими скриптами или программами.

Вам нужно будет запустить скрипт как: strace -q -f -e execve yourscript.sh .

Это будет отслеживать все вызовы, сделанные к другим исполняемым файлам.

[root@devel ~]# ./x.sh 
x
y
z
[root@devel ~]# cat x.sh 
#!/bin/bash
echo x
./y.sh

[root@devel ~]# cat y.sh 
#!/bin/bash

echo y
./z.sh
[root@devel ~]# cat z.sh 
#!/bin/bash

echo z

[root@devel ~]# strace -q -f -e execve ./x.sh 
execve("./x.sh", ["./x.sh"], [/* 28 vars */]) = 0
x
[pid 19781] execve("./y.sh", ["./y.sh"], [/* 28 vars */]) = 0
y
[pid 19782] execve("./z.sh", ["./z.sh"], [/* 28 vars */]) = 0
z
[pid 19781] --- SIGCHLD (Child exited) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) —

Он будет отслеживать даже вызовы Perl или других исполняемых файлов.

[root@devel ~]# cat x.sh 
#!/bin/bash
echo x
./y.sh
ls >/dev/null 2>&1
[root@devel ~]# cat y.sh 
#!/bin/bash

echo y
perl -e 'print "z\n";'
[root@devel ~]# ./x.sh 
x
y
z
[root@devel ~]# strace -q -f -e execve ./x.sh 
execve("./x.sh", ["./x.sh"], [/* 28 vars */]) = 0
x
[pid 20300] execve("./y.sh", ["./y.sh"], [/* 28 vars */]) = 0
y
[pid 20301] execve("/usr/bin/perl", ["perl", "-e", "print \"z\\n\";"], [/* 28 vars */]) = 0
z
[pid 20300] --- SIGCHLD (Child exited) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) ---
[pid 20302] execve("/bin/ls", ["ls"], [/* 28 vars */]) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
[root@devel ~]# 
0 голосов
/ 21 декабря 2016

Если вам просто нужен журнал вызовов bash-скриптов, используйте это приложение https://github.com/lvitya/bash_wrapper

bash_wrapper заменяет сам bash, регистрирует, кто вызвал bash_wrapper, и выполняет исходный bash. То есть он работает с вложенными вызовами bash независимо от опции -x.

Вы можете изменить исходный код для получения графа вызовов, используя точечный формат GraphViz.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...