2017-06-24 4 views
2

Je voulais utiliser DTrace pour voir "quels appels système sont effectués par mon script shell".Echec de l'exécution de script.sh: erreur inconnue

J'ai fait un script shell très simple, shell.sh, et lui a donné les droits d'exécution:

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

I cd « d dans son répertoire, et a couru ce simple script DTrace:

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

I obtenir cette sortie d'erreur:

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

Que s'est-il passé ici ? J'ai couru csrutil enable --without dtrace. Le script DTrace fonctionne bien si je supprime l'argument -c (et remplace $target par un pid).

Est-ce juste un autre Mac? Je cours macOS Sierra 10.12.5 Beta.

+1

Jetez un oeil à cette réponse, il pourrait peut-être résoudre votre problème: https://stackoverflow.com/a/36760408/499581 –

Répondre

1

Grâce au tip auquel @ l'L est lié: j'ai pu contourner ce problème.

Vous aurez besoin de deux coques.

En SHELL A (la coquille nous allons inspectera):

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

En coquille B (la coquille qui se déroulera DTrace), commencer à tracer que PID:

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

Nous utilisons progenyof() pour nous assurer que nous suivons fils traite du shell. J'ai ajouté && pid != $1 puisque pour une raison quelconque progenyof(x) semble inclure x.

De retour à shell A, exécutez un code que vous souhaitez inspecter:

grep 1 <<< 123 

Notre programme DTrace dans la coquille B va attraper avec succès le processus enfant lancé en coquille A.

Il y a un peu de bruit à passer au crible. Peut-être que le shell lance une variété d'enfants. Je ne sais pas comment être plus sélectif.


Il est éducatif de regarder comment dtruss outils -f (« suivre les enfants comme ils sont en forme de fourche ») ...

less "$(which dtruss)" 

clauses pertinentes sont celles qui utilisent un filtre OPT_follow && (indique que -f est activé) ou la variable self->child (indique que ce thread est un enfant du processus spécifié dans -p PID).

Il est également utile de savoir que ppid est une variable intégrée qui vous donne le PID parent.