捕获历史进程历史UNIX



我想知道是否有一种方法可以捕获在非交互式shell上执行的进程列表?

基本上,我有一个脚本,它从其他来源调用一些变量,我想看看这些变量的值是多少。然而,脚本执行和完成得非常快,所以我无法使用ps捕获值。

是否有记录进程的方法以及使用了哪些参数?

TIAHuskie

编辑:

在这种情况下,我使用的是Solaris。我甚至想过用一个快速循环脚本来捕捉传递的值,但这似乎不太准确,我确信执行并不总是被捕捉到。我试过这个:

   #!/bin/ksh
   while [ true ]
   do
   ps -ef | grep  $SCRIPT_NAME |egrep -v 'shl|lis|grep' >> grep_out.txt
   done

我会使用sleep,但我不能指定任何精度,因为我所有的sleep可执行文件都想要一个整数值,而不是任何小数。

在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

如果要跟踪的命令已经在运行,可以将yourCommand替换为-p pid,其中pid是要跟踪的进程id。

编辑:

以下是一种在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来获得相同的(甚至更多)。

大多数shell都可以在调试模式下调用,其中执行的每条语句在变量替换和扩展后都会打印到stdout(或stderr)

对于类似Bourne的shell(shbash),使用-x选项(如在bash -x myscript中)或使用脚本本身中的set -x语句来启用调试。

但是,调试仅适用于"当前"脚本。如果脚本调用其他脚本,这些其他脚本将不会在调试模式下执行。此外,函数中的代码也可能不会在调试模式下执行,这取决于特定的shell,尽管您可以在函数中使用set -x来显式启用调试。

一个非常详细(至少在默认情况下)的选项是使用类似strace的东西。

strace -f -o trace.out script.sh

将为您提供有关脚本正在执行的操作的大量信息。对于您的特定用途,您可能希望使用-e trace=....选项来限制输出,以控制跟踪哪些系统调用。

在Solaris上使用truss而不是strace。在OS X上使用dtruss(我相信)。随着适当的命令行参数的变化。

最新更新