捕获历史进程历史UNIX?

时间:2014-10-01 14:53:18

标签: shell unix process ps non-interactive

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

基本上我有一个脚本从其他来源调用一些变量,我想知道所述变量的值是什么。但是,脚本执行并很快完成,因此我无法使用ps捕获值。

有没有办法记录进程以及使用了哪些参数?

TIA 哈斯基

编辑:

我在这个例子中使用Solaris。我甚至考虑过使用快速循环脚本捕获传递的值 - 但这似乎并不准确,我确信执行并不总是被捕获。 我试过这个:

   #!/bin/ksh

   while [ true ]
   do

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

   done

我使用睡眠但我无法指定任何精度,因为我的所有睡眠可执行文件都需要整数值而不是任何小数值。

3 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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

如果您要跟踪的命令已在运行,您可以将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来获取相同内容(以及更多内容)。

答案 2 :(得分:2)

更加详细(至少默认情况下)选项是使用类似strace的内容。

strace -f -o trace.out script.sh

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

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