2017-06-24 7 views
2

Ich wollte DTrace verwenden, um zu sehen, "welche Syscalls von meinem Shell-Skript gemacht werden".Fehler beim Ausführen von script.sh: unbekannter Fehler

Ich habe ein sehr einfaches Shell-Skript, shell.sh und gab es Privilegien ausführen:

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

I cd ‚in seinem Verzeichnis d und lief diese einfache DTrace-Skript:

sudo dtrace -n 'syscall:::entry 
/pid == $target/ 
{ 
    @[probefunc] = count(); 
}' -c ./trace-me.sh 

I Erhalten Sie diese Fehlerausgabe:

dtrace: failed to execute ./trace-me.sh: unknown error 

Was ist hier passiert ? Ich habe csrutil enable --without dtrace ausgeführt. Das DTrace-Skript läuft einwandfrei, wenn ich das -c arg entfernen (und $target durch eine PID ersetzen).

Ist das nur ein weiterer Mac Gotcha? Ich betreibe macOS Sierra 10.12.5 Beta.

+1

Werfen Sie einen Blick auf diese Antwort, es könnte Ihr Problem lösen: https://stackoverflow.com/a/36760408/499581 –

Antwort

1

Dank der tip an die @ l'L'l verknüpfte: Ich konnte dies umgehen.

Sie benötigen zwei Schalen.

In Shell A (die Schale wir Inspektion werde):

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

In Schale B (die Schale, die DTrace ausgeführt wird), starten Sie Ablaufverfolgung, die PID:

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

Wir verwenden progenyof(), um sicherzustellen, dass wir untergeordnete Prozesse der Shell verfolgen. Ich habe && pid != $1 hinzugefügt, da aus irgendeinem Grund progenyof(x) scheint x zu enthalten.

nun zurück in der Schale A, einige Code ausführen würden Sie untersuchen möchten:

grep 1 <<< 123 

Unser DTrace-Programm in der Schale B erfolgreich das Kind Prozess in der Schale A. gestartet fangen

Es gibt eine ein bisschen Lärm zu durchschauen. Vielleicht startet die Shell eine Vielzahl von Kindern. Nicht sicher, wie man selektiver sein kann.


Es ist lehrreich zu sehen, wie dtruss Geräte -f („folgen Kinder, wie sie gegabelt sind“) ...

less "$(which dtruss)" 

Relevante Abschnitte sind solche, die einen OPT_follow && Filter (zeigt an, dass -f aktiviert ist) oder die self->child Variable (zeigt an, dass dieser Thread ein Kind des in -p PID angegebenen Prozesses ist).

Es ist auch nützlich zu wissen, dass ppid eine eingebaute Variable ist, die Ihnen die Eltern-PID gibt.

Verwandte Themen