2014-10-01 156 views
0

我想知道是否有一種捕獲在非交互式shell上執行的進程列表的方法?捕獲歷史進程歷史UNIX?

基本上我有一個腳本調用其他來源的一些變量,我想看看這些變量的值是什麼。但是,腳本執行速度非常快,因此我無法使用ps捕獲值。

有沒有辦法記錄進程和使用什麼參數?

TIA 哈斯基

編輯:在這種情況下

我使用的Solaris。我甚至想過要有一個快速的循環腳本來捕捉正在傳遞的值 - 但這看起來不太準確,我相信執行並不總是被捕獲。 我嘗試這樣做:

#!/bin/ksh 

    while [ true ] 
    do 

    ps -ef | grep $SCRIPT_NAME |egrep -v 'shl|lis|grep' >> grep_out.txt 

    done 

我會用睡覺,但我的所有睡眠可執行文件需要一個整數值,而不是任何分數值,我不能指定任何精度。

+0

沒有通用的/可移植的方式,但取決於您使用的Unix變體,可能有一個特定的解決方案。 – jlliagre 2014-10-01 15:19:11

回答

3

大多數shell可以在調試模式下調用,其中執行的每個語句都被打印到stdout(或stderr)之後變量替換和擴展。

對於Bourne像炮彈(shbash),調試與-x選項(如bash -x myscript)或使用腳本本身內set -x聲明啓用。

但是,調試僅適用於'當前'腳本。如果腳本調用其他腳本,則這些其他腳本將不會在調試模式下執行。此外,函數內的代碼可能不會在調試模式下執行 - 取決於具體的外殼 - 儘管您可以在函數內使用set -x來明確啓用調試。

+0

如果函數在當前shell中,函數將繼承'-x'。在變量被動態地賦值的情況下(如循環變量等),'-x'在其有用的輸出中受到限制。雖然仍然非常有用。 – 2014-10-01 15:17:42

+0

@EtanReisner與'bash',同意 - 但是IIRC,而不是Solaris'sh'。 – isedev 2014-10-01 15:19:50

+0

是的,我的經驗是專門用'bash'。我不能說其他的炮彈。 – 2014-10-01 15:20:41

2

一個非常詳細的(至少默認情況下)選項是使用類似strace這樣的東西。

strace -f -o trace.out script.sh 

會給你提供關於腳本正在做什麼的大量信息。對於您的具體使用情況,您可能需要使用-e trace=....選項來限制輸出,以控制跟蹤哪些系統調用。在Solaris上使用truss而不是strace。在OS X上使用dtruss(我相信)。通過適當的命令行參數更改。

+1

或Solaris上的'truss'。 – isedev 2014-10-01 15:20:33

+0

如果腳本不是從應用程序端進程觸發的,這將是完美的 - 我肯定會在未來使用它來滿足其他跟蹤需求 – Huskie69 2014-10-03 08:07:40

+0

如果您可以控制應用程序,則可以運行該應用程序。如果不是,但是您可以控制腳本內容,則可以始終使腳本啓動'strace'/etc。 (使用'-p $$'或類似的)。 – 2014-10-03 11:34:15

3

在Solaris上:

truss -s!all -daDf -t exec yourCommand 2>&1 | grep -v ENOENT 

在AIX和其他可能的基於System V的操作系統:

truss -s!all -daDf -t execve yourCommand 2>&1 | grep -v ENOENT 

在Linux和其他操作系統支持strace的,你可以使用這個命令:

strace -ff -etrace=execve yourCommand 2>&1 >/dev/tty | grep -v ENOENT 

如果您想要跟蹤的命令已經在運行,您可以用01替換,其中pid是要跟蹤進程ID的進程。

編輯:

這裏是追蹤你的運行腳本(S)的Solaris下的方式:

for pid in $(pgrep -f $SCRIPT_NAME); do 
    truss -s!all -daDf -t exec -p $pid 2>&1 | grep -v ENOENT > log.$pid.out & 
done 

注意,使用Solaris,您還可以使用dtrace獲得相同的(多) 。

+0

這個用例的'truss'的好例子。但是,我不會使用'dtrace'來達到這個目的,總是過度的。 – isedev 2014-10-03 12:24:16

+0

@isedev你不應該排除'dtrace'。精心製作的'dtrace'腳本比'truss'開銷要小很多,並且會捕獲所有的腳本執行,而不僅僅是'ps'調用中發生的腳本執行。 – jlliagre 2014-10-03 14:27:19

+0

OP想要一個'在非交互式shell上執行的進程列表'(即由它創建的所有子進程 - exec(ve)上的truss綽綽有餘)。我使用'dtrace'很多,但在這種情況下,它似乎使用大錘殺死蚊子。 – isedev 2014-10-03 14:30:39