5 votes

Application ou script pour surveiller/consigner les processus de démarrage et d'arrêt ?

Je veux être en mesure de démarrer une application ou un script, le laisser tourner pendant quelques heures, puis revenir et voir un journal des processus qui ont démarré et arrêté pendant ce temps. Ce n'est pas la même chose que l'Activity Monitor ou Top qui ne me montreront qu'une vue "en direct".

Par exemple, quelque chose comme ceci :

  Safari a démarré
  ssh a démarré
  ssh s'est arrêté
  Safari s'est arrêté

Des recommandations ?

Édition pour clarifier - Je ne connais pas encore les noms des processus que je veux surveiller - je veux savoir quels processus démarrent/arrêtent.

3voto

E1Suave Points 1949

Le script suivant crée dynamiquement un tableau d'applications/processus. Ceci est un avantage dans le sens où vous n'avez pas besoin de "connaître" chaque processus avant son lancement. Cependant, il est important de noter qu'en raison de cette conception, plus le nombre de processus augmente, plus il faudra de temps pour ajouter un nouveau processus au tableau. Pour compenser cela, le script garde les contenus du tableau en cache afin de les utiliser plus tard, évitant ainsi de devoir les réajouter au tableau.

AUSSI : Si l'Application/Processus n'a pas été chargé dynamiquement dans le tableau avant l'arrêt du processus, le journal laissera la colonne "Commande" vide. Cela deviendra de moins en moins probable à mesure que votre tableau construit dynamiquement s'appuie sur ses informations mises en cache. Ajoutant au point précédent. Parfois, une "Commande" peut ne pas être affichée dans la colonne alors qu'elle a déjà été ajoutée au tableau. Cela est probablement dû au fait que certains processus comme "sort" ont été supprimés car ils sont utilisés dans le script et seraient constamment démarrés et arrêtés (ajoutant de faux positifs au journal). Actuellement, les données seront placées dans le fichier / command_logger. Cela peut bien sûr être modifié à votre convenance. Le fichier de configuration /tmp/command_logger.plist peut également être renommé/déplacé, mais n'oubliez pas qu'il contient les données du tableau d'applications/processus croissant.

N'hésitez pas à utiliser et à modifier le script suivant comme bon vous semble. N'oubliez pas d'utiliser un environnement de test avant de l'exécuter sur votre environnement principal. Amusez-vous bien.

Testé sur :

• 10.5.x
• 10.6.x
• 10.7.4

La sortie inclura les éléments suivants :

  • STARTED/STOPPED (DÉMARRÉ/ARRÊTÉ)
  • Époque (timestamp)
  • Date/Heure
  • PID
  • Application/Processus

command_logger

REMARQUE : Le script suivant inclut une boucle interne.

JOURNAL DYNAMIQUE DES APPLICATIONS/PROCESSUS

#!/bin/bash

On="true"

TMP="/tmp/command_logger"
LOG_CONFIG="/command_logger.plist"
LOG="/command_logger"

if [[ ! -e ${TMP} ]]; then

    mkdir ${TMP}

    if [[ ! -e ${TMP}${LOG_CONFIG} ]]; then
        /usr/libexec/PlistBuddy -c "Add:Commands Dict" ${TMP}${LOG_CONFIG} > /dev/null 2>&1
    fi

elif [[ -e ${TMP} ]]; then

    if [[ ! -e ${TMP}${LOG_CONFIG} ]]; then
        /usr/libexec/PlistBuddy -c "Add:Commands Dict" ${TMP}${LOG_CONFIG} > /dev/null 2>&1
        find ${TMP} -type f ! -name '*.plist' -exec rm -f {} \;
    elif [[ -e ${TMP}${LOG_CONFIG} ]]; then
        find ${TMP} -type f ! -name '*.plist' -exec rm -f {} \;
    fi

fi

if [[ ! -e ${LOG} ]]; then
    echo -e "Status\tTimestamp\tDate/Time\t\tPID\tCommand\n" > ${LOG}
elif [[ -e ${LOG} ]]; then

    TITLE=$(head -1 ${LOG} | awk '{print $1}')

    if [[ ${TITLE} != "Status" ]]; then
        echo -e "Status\tTimestamp\tDate/Time\t\tPID\tCommand\n" > ${LOG}
    fi

fi

while [[ ${On} == "true" ]]; do
    IFS=""

    Live_Array=$(ps -Ac | sed 's/  /|/g' | sed 's/ /_/g' | sed 's/[[:digit:]]_.*[[:digit:]]_/ /g' | sed 's/:/!/' | sed 's/$/.comm/' | sed 's/^_//g' | sed 's/^|//g' | sed 's/^_//g' | sed 's/^|.*//g' | sed 's/ $//g' | sed 's/_$//g' | sed 's/|$//g' | sed 's/PID_TTY||.*//g' | awk '{print $2}' | sed 's/.*-sh.*//' | sed 's/.*CMD.*//' | sed 's/.*PID.*//' | sort -u | grep "[[:graph:]]" | tr -s "[\n]" "[,]")
    Live_Array=$(echo ${Live_Array%\,})
    IFS=","
    Live_Array_2=( $Live_Array )
    livarray=${#Live_Array_2[@]}    
    for (( liv=0; liv<${livarray}; liv++ ));
    do  

        /usr/libexec/PlistBuddy -c "Add:Commands:${Live_Array_2[$liv]} bool true" ${TMP}${LOG_CONFIG} 2> /dev/null

        Config_Array=$(/usr/libexec/PlistBuddy -c "Print:Commands" ${TMP}${LOG_CONFIG} | grep "=" | sed 's/=.*//' | sed 's/  //g' | sed 's/^.comm//' | sed 's/ $//g' | grep "[[:graph:]]" | tr -s "[\n]" "[,]")
        Config_Array_2=( $Config_Array )
        conarray=${#Config_Array_2[@]}  

        for (( con=0; con<${conarray}; con++ ));
        do  

            STRING=$(ps -Ac | sed 's/  /|/g' | sed 's/ /_/g' | sed 's/[[:digit:]]_.*[[:digit:]]_/ /g' | sed 's/:/!/'  | sed 's/$/.comm/' | sed 's/^_//g' | sed 's/^|//g' | sed 's/^_//g' | sed 's/^|.*//g' | sed 's/|_.comm/.comm/g' | sed 's/PID_TTY||.*//g' | awk '{print $2,$1}' | sed 's/.*-sh.*//' | sed 's/.*CMD.*//' | sed 's/.*PID.*//' | sort -u)
            Launched_Command=$(echo ${STRING} | awk '{print $1}' | sort -u | awk "/${Config_Array_2[$con]}/")
            PID=$(echo ${STRING} | sort -u | awk '{print $2,$1}' | awk "/${Config_Array_2[$con]}/" | sed 's/ .*//')

            if [[ ${Launched_Command} != "" ]] && [[ ${PID} != "" ]]; then

                DATE=$(date "+%m-%d-%Y %T")
                EPOCH=$(date "+%s") 

                if [[ ${Launched_Command} == ${Config_Array_2[$con]} ]] && [[ ! -e ${TMP}/${Config_Array_2[$con]}-RUNNING ]];          
                    echo -e "STARTED\t${EPOCH}\t${DATE}\t${PID}\t${Config_Array_2[$con]}" | sed 's/.comm$//g' | sed 's/_/ /g' | sed 's/.*sort.*//g' | sed 's/.*sed.*//g' | sed 's/awk//g'| awk '/STARTED/' >> ${LOG}
                    rm -f ${TMP}/${Config_Array_2[$con]}-STOPPED
                    touch ${TMP}/${Config_Array_2[$con]}-RUNNING
                elif [[ ${Launched_Command} == ${Config_Array_2[$con]} ]] && [[ -e ${TMP}/${Config_Array_2[$con]}-RUNNING ]]; then
                    :       
                elif [[ ${Launched_Command} == ${Config_Array_2[$con]} ]] && [[ -e ${TMP}/${Config_Array_2[$con]}-RUNNING ]]; then

                    if [[ -e ${TMP}/${Config_Array_2[$con]}-STOPPED ]]; then
                        :
                    elif [[ ! -e ${TMP}/${Config_Array_2[$con]}-STOPPED ]]; then
                        echo -e "STOPPED\t${EPOCH}\t${DATE}\t${PID}\t${Config_Array_2[$con]}" | sed 's/.comm$//g' | sed 's/_/ /g' | sed 's/.*sort.*//g' | sed 's/.*sed.*//g' | sed 's/awk//g' | awk '/STOPPED/' >> ${LOG}
                        rm -f ${TMP}/${Config_Array_2[$con]}-RUNNING
                        touch ${TMP}/${Config_Array_2[$con]}-STOPPED                    
                    fi  

                fi

            elif [[ ${Launched_Command} == "" ]] && [[ -e ${TMP}/${Config_Array_2[$con]}-RUNNING ]]; then

                if [[ -e ${TMP}/${Config_Array_2[$con]}-STOPPED ]]; then
                    :
                elif [[ ! -e ${TMP}/${Config_Array_2[$con]}-STOPPED ]]; then
                    echo -e "STOPPED\t${EPOCH}\t${DATE}\t${PID}\t${Config_Array_2[$con]}" | sed 's/.comm$//g' | sed 's/_/ /g' | sed 's/.*sort.*//g' | sed 's/.*sed.*//g' | sed 's/awk//g' | awk '/STOPPED/' >> ${LOG}
                    rm -f ${TMP}/${Config_Array_2[$con]}-RUNNING
                    touch ${TMP}/${Config_Array_2[$con]}-STOPPED                    
                fi              
            fi      
        done
    done    
done

1voto

binarybob Points 9292

Avez-vous jeté un coup d'œil à fseventer?

Cela vous permet de voir une représentation graphique de l'activité du système de fichiers et, même s'il fait beaucoup plus que ce dont vous pourriez avoir besoin, il peut également lister le lancement et la fermeture des applications (que vous devriez ensuite pouvoir filtrer pour supprimer les autres événements inutiles).

0voto

Andrei Freeman Points 313

Effectivement, ce que fait top, c'est échantillonner le gestionnaire de processus. Le gestionnaire de processus dispose d'API C au niveau Unix, d'API Obj-C au niveau Cocoa, et bien sûr des commandes PS et TOP.

Je pense que ce que vous cherchez va nécessiter un peu plus de programmation qu'un script. Je ne pense pas non plus qu'un tel outil existe (dont je ne suis pas sûr) et que vous trouverez difficilement une application Mac gratuite pour cela.

Vous pouvez peut-être en trouver un dans la communauté open source (Google Code, Git, etc) si vous cherchez un "Enregistreur de processus."

Si vous envisagez d'en créer un vous-même, vous devriez peut-être demander sur StackOverflow plutôt que ici.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X