5 votos

Aplicación o script a monitor/registro de procesos de arranque y parada?

Quiero ser capaz de iniciar una aplicación o un script, se deja correr por un par de horas, luego volver y ver un registro de qué procesos se inicia y se detiene en ese momento. Este no es el mismo que el Monitor de Actividad o Superior y que sólo me muestre un "en vivo".

E. g. 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 - ya no sepa los nombres de los procesos quiero monitor - quiero averiguar qué procesos están iniciar/detener.

3voto

WeasleyWaali Puntos 6

La siguiente secuencia de comandos genera una matriz de Aplicaciones/Procesos de forma dinámica. Esto es una ventaja en el sentido de que no necesita "saber" de cada proceso antes de su lanzamiento. Sin embargo, es importante tener en cuenta que debido a este diseño como el número de procesos de crecer, más tiempo tendrá para agregar un nuevo proceso para la matriz. Para compensar esto el script se guarda el contenido de la matriz en caché con el fin de utilizarlos posteriormente la prevención de la necesidad de volver a agregar a la matriz.

TAMBIÉN: Si la Aplicación o el Proceso no ha sido cargado dinámicamente en la matriz antes de que el proceso de detener el registrador se deja el "Comando" de la columna de vacío. Este va a ser menos y menos probable en la medida en que su dinámica de la matriz se construye sobre su información almacenada en caché. La adición del punto anterior. A veces, un "Comando" no pueden ser mostrados en la columna sin embargo, ya se ha agregado a la matriz. Esto es probablemente causado por el hecho de que ciertos procesos como "ordenar" se han eliminado, ya que se utilizan en la secuencia de comandos y sería constantemente, iniciar y detener (la adición de falsos positivos para el registrador). En la actualidad los datos se colocarán en el archivo /command_logger. Por supuesto, esto puede ser cambiado como mejor le parezca. El archivo de configuración /tmp/command_logger.plist también se puede cambiar/movido, pero recuerde que tiene los datos a la creciente Aplicación/matriz del Proceso.

Por favor, siéntase libre de usar y modificar la siguiente secuencia de comandos como mejor le parezca. Por favor, recuerde utilizar un entorno de pruebas antes de que se ejecutan en su entorno principal. Disfrutar.

Prueba en:

•   10.5.x
•   10.6.x
•   10.7.4

La salida será la siguiente:

  • INICIA/DETIENE
  • Época (fecha y hora)
  • Fecha/Hora
  • PID
  • Aplicación/Proceso

command_logger

NOTA: La siguiente secuencia de comandos incluye un bucle interno.

DINÁMICA DE LA APLICACIÓN/PROCESO DE REGISTRADOR

#!/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 ]]; 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

1voto

binarybob Puntos 6395

Ha tenido usted un vistazo a fseventer?

Esto permite ver una representación gráfica de la actividad del sistema de archivos y, aunque hace mucho más que usted puede ser que necesite, puede también de la lista de inicio de la aplicación y de salida (lo que usted debe entonces ser capaz de filtrar para eliminar otros eventos que no necesitas).

0voto

Marton Puntos 299

Efectivamente ¿qué está haciendo es la muestra de que el administrador de procesos. El administrador de procesos ha APIs C en Unix nivel, Obj-C Api en el Cacao nivel, y por supuesto, los comandos PS y TOP.

Creo que lo que usted está buscando va a requerir un poco más que la programación de una secuencia de comandos. Yo tampoco creo que si un animal existe (que no estoy seguro) de que usted no es probable encontrar en una Aplicación de Mac de forma gratuita.

Usted puede encontrar uno en la comunidad de código abierto (Código de Google, Git, etc) si usted empuje alrededor de un "Proceso de Registrador."

Si usted está pensando en girar uno de sus propios dueños, es posible que desee pedir alrededor de StackOverflow en lugar de aquí.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X