Не удалось выполнить script.sh: неизвестная ошибка

Я хотел использовать DTrace, чтобы увидеть, "какие системные вызовы сделаны моим сценарием оболочки".

Я сделал очень простой сценарий оболочки, shell.shи дал ему права на выполнение:

#!/bin/bash
grep 1 <<< 123

я cdпереместился в его каталог и запустил этот простой скрипт DTrace:

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, Сценарий DTrace работает нормально, если я удаляю -c arg (и заменить $target с пидом).

Это просто еще один Mac, попался? Я использую macOS Sierra 10.12.5 Beta.

1 ответ

Решение

Благодаря подсказке, с которой связывался @l'L'l: я смог обойти это.

Вам понадобятся две раковины.

В оболочке А (оболочку мы будем проверять):

# copy this shell's PID to clipboard (93827 for this example)
echo $$ | pbcopy

В оболочке B (оболочка, которая будет запускать DTrace), начните отслеживать этот PID:

sudo dtrace -n 'syscall:::entry
/progenyof($1) && pid != $1/
{
    @[probefunc] = count();
}' 93827

Мы используем progenyof() чтобы мы могли отслеживать дочерние процессы оболочки. я добавил && pid != $1 так как по какой-то причине progenyof(x) похоже включает x,

Теперь вернемся в оболочку A и запустим код, который вы хотели бы проверить:

grep 1 <<< 123

Наша программа DTrace в оболочке B успешно перехватит дочерний процесс, запущенный в оболочке A.

Там немного шума просеять. Возможно, снаряд запускает множество детей. Не уверен, как быть более избирательным.


Учиться смотреть, как реализует Dtruss -f ("Следуйте за детьми, как они раздвоены")...

less "$(which dtruss)"

Соответствующие пункты те, которые используют OPT_follow && фильтр (указывает на то, что -f включен) или self->child переменная (указывает, что этот поток является дочерним по отношению к процессу, указанному в -p PID).

Также полезно знать, что ppid является встроенной переменной, которая дает вам родительский PID.

Другие вопросы по тегам