Uma abordagem diferente
Um arquivo de contador separado tem desvantagens:
- São necessários 4096 bytes (ou seja qual for o tamanho do bloco) para cada arquivo do contador.
- Você precisa procurar o nome do arquivo no script bash e abrir o arquivo para ver a contagem.
- Não há bloqueio de arquivo (em outras respostas), portanto é possível que duas pessoas atualizem o contador ao mesmo tempo (chamada condição de corrida nos comentários na resposta do Byte Commander).
Portanto, esta resposta elimina um arquivo contador separado e coloca a contagem no próprio script bash!
- Colocar o contador no próprio script permite que você veja dentro do próprio script quantas vezes ele foi executado.
- O uso de
flock
garante que, por um breve momento, não seja possível que dois usuários executem o script ao mesmo tempo.
- Como o nome do arquivo do contador não é codificado, você não precisa alterar o código de scripts diferentes, basta fazer a sua fonte ou copiá-lo e colá-lo em um arquivo stub / boilerplate.
O código
#!/bin/bash
# NAME: run-count.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: https://sobrelinux.info/questions/15056/how-can-i-cause-a-script-to-log-in-a-separate-file-the-number-of-times-it-has-be"${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
# This is useful boilerplate code for shell scripts. Put it at the top of
# the shell script you want to lock and it'll automatically lock itself on
# the first run. If the env var $FLOCKER is not set to the shell script
# that is being run, then execute flock and grab an exclusive non-blocking
# lock (using the script itself as the lock file) before re-execing itself
# with the right arguments. It also sets the FLOCKER env var to the right
# value so it doesn't run again.
# Read this script with entries separated newline " " into array
mapfile -t ScriptArr < "$0"
# Build search string that cannot be named
SearchStr="This script"
SearchStr=$SearchStr" run count: "
# Find our search string in array and increment count
for i in ${!ScriptArr[@]}; do
if [[ ${ScriptArr[i]} = *"$SearchStr"* ]]; then
OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 )
NewCnt=$(( $OldCnt + 1 ))
ScriptArr[i]=$SearchStr$NewCnt
break
fi
done
# Rewrite our script to disk with new run count
# BONUS: Date of script after writing will be last run time
printf "%s\n" "${ScriptArr[@]}" > "$0"
# ========= FROM HERE UP CAN GO INTO FILE INCLUDED WITH SOURCE COMMAND ========
# Now we return you to your original programming....
exit 0
Outra abordagem usando um arquivo de log
Semelhante à resposta da Videonauth, escrevi uma resposta de arquivo de log aqui: Script de bash para manter trilha de auditoria / log de arquivos acessados para registrar todas as vezes que os poderes de root foram usados com gedit
ou nautilus
.
A captura é, em vez de usar gksu
, o script chama-se gsu
e invoca pkexec
a maneira "moderna" de usar o sudo na GUI, por isso me disseram.
Outra vantagem não é apenas dizer que cada vez que os poderes de root foram usados com gedit
, ele registra o nome do arquivo que foi editado.
Aqui está o código.
~/bin/gsu
:
#!/bin/bash
# Usage: gsu gedit file1 file2...
# -OR- gsu natuilus /dirname
# & is used to spawn process and get prompt back ASAP
# > /dev/null is used to send gtk warnings into dumpster
COMMAND="$1" # extract gedit or nautilus
pkexec "$COMMAND" "${@:2}"
log-file "${@:2}" gsu-log-file-for-"$COMMAND"
/usr/local/bin/log-file
:
#! /bin/bash
# NAME: log-file
# PATH: /usr/local/bin
# DESC: Update audit trail/log file with passed parameters.
# CALL: log-file FileName LogFileName
# DATE: Created Nov 18, 2016.
# NOTE: Primarily called from ~/bin/gsu
ABSOLUTE_NAME=$(realpath "$1")
TIME_STAMP=$(date +"%D - %T")
LOG_FILE="$2"
# Does log file need to be created?
if [ ! -f "$LOG_FILE" ]; then
touch "$LOG_FILE"
echo "__Date__ - __Time__ - ______File Name______" >> "$LOG_FILE"
# MM/DD/YY - hh:mm:ss - "a/b/c/FileName"
fi
echo "$TIME_STAMP" - '"'"$ABSOLUTE_NAME"'"' >> "$LOG_FILE"
exit 0
Conteúdo do arquivo de log gsu-log-file-for-gedit
após algumas edições:
__Date__ - __Time__ - ______File Name______
11/18/16 - 19:07:54 - "/etc/default/grub"
11/18/16 - 19:08:34 - "/home/rick/bin/gsu"
11/18/16 - 19:09:26 - "/home/rick/bin/gsu"