首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >捕获历史进程历史,UNIX?

捕获历史进程历史,UNIX?
EN

Stack Overflow用户
提问于 2014-10-01 14:53:18
回答 3查看 3.6K关注 0票数 0

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

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

是否有一种方法来记录进程和使用了哪些参数?

蒂娅·赫斯基

编辑:

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

代码语言:javascript
复制
   #!/bin/ksh

   while [ true ]
   do

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

   done

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-10-01 16:52:37

关于Solaris:

代码语言:javascript
复制
truss -s!all -daDf -t exec yourCommand 2>&1 | grep -v ENOENT

在AIX和可能的其他基于System的OSes上:

代码语言:javascript
复制
truss -s!all -daDf -t execve yourCommand 2>&1 | grep -v ENOENT

在Linux和其他支持strace的OSes上,您可以使用以下命令:

代码语言:javascript
复制
strace -ff -etrace=execve yourCommand 2>&1 >/dev/tty | grep -v ENOENT

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

编辑:

下面是在Solaris下跟踪正在运行的脚本的一种方法:

代码语言:javascript
复制
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获取相同的信息(以及更多信息)。

票数 3
EN

Stack Overflow用户

发布于 2014-10-01 14:58:28

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2014-10-01 15:19:16

还有一个更详细的选项(至少在默认情况下)是使用类似于strace的方法。

代码语言:javascript
复制
strace -f -o trace.out script.sh

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26144231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档