App o script per monitorare / registrare i processi di avvio e di arresto?

5

Voglio poter avviare un'app o uno script, lasciarlo in esecuzione per alcune ore, quindi tornare indietro e visualizzare un registro dei processi avviati e arrestati in quel momento. Questo non è lo stesso di Activity Monitor o Top che mostrerà solo una vista "live".

es. qualcosa di simile:

<timestamp> <pid> Safari started
<timestamp> <pid> ssh started
<timestamp> <pid> ssh stopped
<timestamp> <pid> Safari stopped

Qualche raccomandazione?

Modifica per chiarire - Non conosco già i nomi dei processi che voglio monitorare - Voglio scoprire quali processi stanno avviando / fermando.

    
posta snowcrash09 02.05.2012 - 11:41
fonte

3 risposte

3

Lo script seguente crea dinamicamente una serie di applicazioni / processi. Questo è un vantaggio, nel senso che non è necessario "conoscere" ogni processo prima del suo lancio. Tuttavia, è importante notare che, a causa di questa progettazione, man mano che il numero di processi aumenta, occorrerà aggiungere un nuovo processo all'array. Per compensare questo lo script mantiene il contenuto della matrice memorizzata nella cache in modo da utilizzarli in un secondo momento, evitando la necessità di riaggiungerli all'array.

ANCHE: se l'applicazione / processo non è stato caricato dinamicamente nell'array prima che il processo si fermasse, il logger lascerà vuota la colonna "Comando". Ciò diventerà sempre meno probabile man mano che l'array generato dinamicamente si basa sulle sue informazioni memorizzate nella cache. Aggiungendo al punto precedente. A volte un "Comando" potrebbe non essere mostrato nella colonna, ma è già stato aggiunto all'array. Questo è probabilmente causato dal fatto che alcuni processi come "sort" sono stati rimossi man mano che vengono utilizzati nello script e dovrebbero essere costantemente avviati e fermati (aggiungendo falsi positivi al logger). Attualmente i dati verranno inseriti nel file / command_logger . Questo ovviamente può essere modificato come meglio credi. Il file di configurazione /tmp/command_logger.plist può anche essere rinominato / spostato, ma ricorda che contiene i dati nell'array App / Process in crescita.

Non esitate a utilizzare e modificare il seguente script come meglio credi. Ricordarsi di utilizzare un ambiente di test prima di eseguire sul proprio ambiente primario. Godetevi.

Testato su:

•   10.5.x
•   10.6.x
•   10.7.4

L'output includerà quanto segue:

  • avviato / arrestato
  • Epoch (timestamp)
  • Data / Ora
  • PID
  • Applicazione / Processo

NOTA:ilseguentescriptincludeunciclointerno.

APPDIAPP/PROCESSDINAMICO

#!/bin/bashOn="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 ]]; then          
                    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
    
risposta data 03.05.2012 - 00:32
fonte
1

Hai dato un'occhiata a fseventer ?

Permette di vedere una rappresentazione grafica dell'attività del file system e, mentre fa molto più di quanto potrebbe essere necessario, può anche elencare l'avvio e l'uscita dell'applicazione (che dovresti quindi poter filtrare per rimuovere altri eventi) non ti serve).

    
risposta data 03.05.2012 - 10:17
fonte
0

Effettivamente ciò che sta facendo è campionare il gestore dei processi. Il process manager ha API C a livello Unix, API Obj-C a livello Cocoa e, naturalmente, i comandi PS e TOP.

Penso che ciò che stai cercando richiederà un po 'più di programmazione rispetto a uno script. Inoltre, non credo che se esista una tale bestia (di cui non sono sicuro) non è facile trovare un'applicazione per Mac gratuitamente.

Potresti trovarne uno nella community open source (Google Code, Git, ecc.) se cerchi un "Process Logger".

Se stai pensando di girare uno dei tuoi; potresti voler chiedere in giro StackOverflow piuttosto che qui.

    
risposta data 02.05.2012 - 14:55
fonte

Leggi altre domande sui tag