2014-10-01 144 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