¿Aplicación o script para monitorear / registrar procesos que se inician y se detienen?

5

Quiero poder iniciar una aplicación o script, dejarlo en ejecución durante unas horas, luego regresar y ver un registro de los procesos iniciados y detenidos en ese momento. No es lo mismo que Activity Monitor o Top, que solo me mostrará una vista "en vivo".

Por ejemplo, algo como esto:

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

¿Alguna recomendación?

Editar para aclarar: no conozco los nombres de los procesos que quiero monitorear, quiero saber qué procesos se están iniciando / deteniendo.

    
pregunta snowcrash09 02.05.2012 - 11:41

3 respuestas

3

La siguiente secuencia de comandos crea una matriz de Aplicaciones / Procesos de forma dinámica. Esta es una ventaja en el sentido de que no necesita "conocer" todos los procesos antes de su lanzamiento. Sin embargo, es importante tener en cuenta que debido a este diseño, a medida que la cantidad de procesos crece, más tiempo tomará agregar un nuevo proceso a la matriz. Para compensar esto, el script mantiene el contenido de la matriz en caché para usarlos más tarde, lo que evita la necesidad de volver a agregarlos a la matriz.

TAMBIÉN: si la aplicación / proceso no se ha cargado dinámicamente en la matriz antes de que el proceso, al detener el registrador, la columna "Comando" quedará vacía. Esto será cada vez menos probable a medida que su matriz de construcción dinámica se construya sobre su información almacenada en caché. Añadiendo al punto anterior. En ocasiones, es posible que un "Comando" no se muestre en la columna y que ya se haya agregado a la matriz. Esto probablemente se debe al hecho de que ciertos procesos como el "ordenamiento" se han eliminado a medida que se usan en el script y se iniciarían y detendrían constantemente (agregando falsos positivos al registrador). Actualmente, los datos se colocarán en el archivo / command_logger . Esto, por supuesto, se puede cambiar como mejor le parezca. El archivo de configuración /tmp/command_logger.plist también puede ser renombrado / movido, pero recuerde que guarda los datos en la creciente gama de aplicaciones / procesos.

Por favor, siéntase libre de usar y modificar el siguiente script como mejor le parezca. Recuerde utilizar un entorno de prueba antes de ejecutar en su entorno principal. Disfrutar.

Probado en:

•   10.5.x
•   10.6.x
•   10.7.4

La salida incluirá lo siguiente:

  • INICIADO / DETENIDO
  • Epoch (timestamp)
  • Fecha / Hora
  • PID
  • Solicitud / Proceso

NOTA:Lasiguientesecuenciadecomandosincluyeunbucleinterno.

APLICACIÓNDINÁMICA/REGISTRADORDEPROCESO

#!/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
    
respondido por el E1Suave 03.05.2012 - 00:32
1

¿Ha visto fseventer ?

Le permite ver una representación gráfica de la actividad del sistema de archivos y, aunque hace mucho más de lo que podría necesitar, también puede enumerar el inicio y el cierre de la aplicación (que debería poder filtrar para eliminar otros eventos). no necesitas).

    
respondido por el binarybob 03.05.2012 - 10:17
0

Efectivamente, lo que Top está haciendo es muestrear al administrador de procesos. El administrador de procesos tiene API de C en el nivel de Unix, API de Obj-C en el nivel de Cocoa y, por supuesto, los comandos PS y TOP.

Creo que lo que está buscando requerirá un poco más de programación que un script. Tampoco creo que si existe tal bestia (de la que no estoy seguro), es probable que no encuentre una aplicación para Mac gratis.

Tal vez puedas encontrar uno en la comunidad de código abierto (Google Code, Git, etc.) si buscas un "Procesador de proceso".

Si estás pensando en hacer girar uno de los tuyos; es posible que desee consultar sobre StackOverflow en lugar de aquí.

    
respondido por el Andrei Freeman 02.05.2012 - 14:55

Lea otras preguntas en las etiquetas