Не удалось выполнить 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.