2011-03-02 58 views
2

我想一個腳本/工具就好理解了C++,給了主bash腳本調用回溯(scitools):跟蹤的bash調用

  • 其他的bash腳本
  • 的Python
  • 的Java
  • Perl

讓我知道發生了什麼。

我不需要複雜的圖形,簡單的文本文件是足夠的。

什麼讓我可以做到這一點?

回答

3

您可以使用strace來跟蹤您的腳本執行其他腳本或程序。

您將不得不運行您的腳本,如:strace -q -f -e execve yourscript.sh

這將跟蹤對其他可執行文件所做的所有調用。

[[email protected] ~]# ./x.sh 
x 
y 
z 
[[email protected] ~]# cat x.sh 
#!/bin/bash 
echo x 
./y.sh 

[[email protected] ~]# cat y.sh 
#!/bin/bash 

echo y 
./z.sh 
[[email protected] ~]# cat z.sh 
#!/bin/bash 

echo z 

[[email protected] ~]# 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或其他可執行文件的調用。

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

echo y 
perl -e 'print "z\n";' 
[[email protected] ~]# ./x.sh 
x 
y 
z 
[[email protected] ~]# 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) --- 
[[email protected] ~]# 
+0

非常好,簡單而有用。因此,我需要實現一個bash腳本來調用帶有strace的主文件並將其傳輸到文件而不是stdout? – dlewin 2011-03-03 08:34:57

+0

如果您始終需要跟蹤(即使在生產中),您可以編寫一個包裝腳本來執行strace並僅捕獲日誌文件中的stderr(strace -q -f -e execve ./x.sh 2>/var/log /x.trace)。這樣你就可以在標準輸出上獲得正常輸出,並在/var/log/x.trace中獲得跟蹤。唯一的問題是,如果你的腳本寫入stderr,那麼也會以x.trace結束。 – 2011-03-03 13:12:39

6

使用set -x或運行使用bash -x將打印每行的腳本,它的執行之前(但變量替換,它可以是有用的,但也可能是討厭的,有時後):

bash -x myScript.sh 
+0

嗯,這並不完全是因爲這是bash的打印輸出。在多次調用(bash調用bash)的情況下,我必須手動執行。因爲它是一個主腳本,打印出來的東西太多了;正如你所說(@Joachim)這是討厭的。 – dlewin 2011-03-02 15:29:16

+0

它應該是'set -x'而不是'+ x'。添加'-v'將打印該行而不擴展。 – 2011-03-02 17:49:31

+0

@丹尼斯:謝謝,修正。我通常使用'bash -x'版本,所以我沒有記錯。 – 2011-03-02 17:51:40

0

如果你只是neeed的bash腳本通話記錄,使用這個應用程序 https://github.com/lvitya/bash_wrapper

bash_wrapper替換慶典本身,日誌誰叫bash_wrapper和exec原來的bash。這是它獨立於-x選項處理嵌套的bash調用。

您可以修改源代碼以使用GraphViz的點格式獲取調用圖。