我想使用DTrace来查看“我的shell脚本所做的系统调用”。
我制作了一个非常简单的shell脚本declare @temp2 table
(
name text,
cost integer
)
insert @temp2(name) SELECT DISTINCT ename6 from dbo.condensed7day_query_result
UPDATE t
SET t.cost = sum(dbo.condensed7day_query_result.cost)
FROM dbo.condensed7day_query_result
WHERE dbo.condensed7day_query_result.ename6 = t.name)
FROM @temp2 t
select * from @temp2
,并赋予它执行权限:
shell.sh
我#!/bin/bash
grep 1 <<< 123
进入其目录,并运行这个简单的DTrace脚本:
cd
我收到此错误输出:
sudo dtrace -n 'syscall:::entry
/pid == $target/
{
@[probefunc] = count();
}' -c ./trace-me.sh
这里发生了什么?我跑了dtrace: failed to execute ./trace-me.sh: unknown error
。如果删除csrutil enable --without dtrace
arg(并用pid替换-c
),则DTrace脚本可以正常运行。
这只是另一个Mac陷阱吗?我正在运行macOS Sierra 10.12.5 Beta。
答案 0 :(得分:1)
感谢@ l&#39; L&#39; l链接的tip:我能够解决这个问题。
你需要两个炮弹。
在shell A中(我们将要检查的shell):
# copy this shell's PID to clipboard (93827 for this example)
echo $$ | pbcopy
在shell B(将运行DTrace的shell)中,开始跟踪PID:
sudo dtrace -n 'syscall:::entry
/progenyof($1) && pid != $1/
{
@[probefunc] = count();
}' 93827
我们使用progenyof()
来确保跟踪shell的子进程。我已添加&& pid != $1
,因为某些原因progenyof(x)
似乎包含x
。
现在回到shell A中,运行一些你想要检查的代码:
grep 1 <<< 123
我们在shell B中的DTrace程序将成功捕获在shell A中启动的子进程。
要筛选出一点噪音。也许贝壳发射了各种各样的孩子。不确定如何更具选择性。
了解dtruss如何实施-f
(&#34;跟随孩子分叉和#34;)的教育......
less "$(which dtruss)"
相关条款是那些使用OPT_follow &&
过滤器(表示已启用-f
)或self->child
变量(表示此线程是{{1}中指定的进程的子级的子句}})。
知道ppid
是一个内置变量,它可以为您提供父PID,这也很有用。