我想知道是否有一种方法可以捕获在非交互式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(sh
、bash
),使用-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
(我相信)。随着适当的命令行参数的变化。