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
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