无法执行script.sh:未知错误

时间:2017-06-24 23:23:48

标签: macos bsd dtrace

我想使用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。

1 个答案:

答案 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,这也很有用。