我想知道是否有办法捕获在非交互式shell上执行的进程列表?
基本上我有一个脚本从其他来源调用一些变量,我想知道所述变量的值是什么。但是,脚本执行并很快完成,因此我无法使用ps捕获值。
有没有办法记录进程以及使用了哪些参数?
TIA 哈斯基
编辑:
我在这个例子中使用Solaris。我甚至考虑过使用快速循环脚本捕获传递的值 - 但这似乎并不准确,我确信执行并不总是被捕获。 我试过这个:
#!/bin/ksh
while [ true ]
do
ps -ef | grep $SCRIPT_NAME |egrep -v 'shl|lis|grep' >> grep_out.txt
done
我使用睡眠但我无法指定任何精度,因为我的所有睡眠可执行文件都需要整数值而不是任何小数值。
答案 0 :(得分:3)
大多数shell都可以在调试模式下调用,其中正在执行的每个语句在变量替换和扩展后打印到stdout(或stderr)。
对于类似Bourne的shell(sh
,bash
),使用-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
(我相信)。使用适当的命令行参数更改。