我想知道是否有一种方法可以捕获在非交互式shell上执行的进程列表?
基本上,我有一个脚本,它从其他来源调用一些变量,我想看看这些变量的值是什么。但是,脚本执行和完成得非常快,所以我无法使用ps捕获值。
是否有一种方法来记录进程和使用了哪些参数?
蒂娅·赫斯基
编辑:
我在这个例子中使用了Solaris。我甚至考虑过使用一个快速循环脚本来捕获正在传递的值--但这似乎不太准确,而且我确信执行并不总是被捕获的。我试过这个:
#!/bin/ksh
while [ true ]
do
ps -ef | grep $SCRIPT_NAME |egrep -v 'shl|lis|grep' >> grep_out.txt
done我使用睡眠,但我不能指定任何精度,因为所有睡眠可执行文件都需要一个整数值,而不是任何小数值。
发布于 2014-10-01 16:52:37
关于Solaris:
truss -s!all -daDf -t exec yourCommand 2>&1 | grep -v ENOENT在AIX和可能的其他基于System的OSes上:
truss -s!all -daDf -t execve yourCommand 2>&1 | grep -v ENOENT在Linux和其他支持strace的OSes上,您可以使用以下命令:
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获取相同的信息(以及更多信息)。
发布于 2014-10-01 14:58:28
大多数shell都可以在调试模式下调用,其中正在执行的每条语句都在变量替换和扩展后打印到stdout (或stderr)中。
对于类似Bourne的shell (sh、bash),可以使用-x选项(如在bash -x myscript中)或在脚本本身中使用set -x语句来启用调试。
但是,调试只适用于“当前”脚本。如果脚本调用其他脚本,这些其他脚本将不会在调试模式下执行。此外,函数内部的代码也可能不会在调试模式下执行--取决于特定的shell --尽管您可以在函数中使用set -x显式地启用调试。
发布于 2014-10-01 15:19:16
还有一个更详细的选项(至少在默认情况下)是使用类似于strace的方法。
strace -f -o trace.out script.sh将为您提供大量关于脚本正在做什么的信息。对于您的特定用法,您可能希望使用-e trace=....选项来限制输出,以控制跟踪哪个系统调用。
在Solaris上使用truss而不是strace。在OS上使用dtruss (我相信)。使用适当的命令行参数也可以更改。
https://stackoverflow.com/questions/26144231
复制相似问题