Eu me deparei com este método discutido em SO neste Q & A intitulado: . Abaixo estão os detalhes desse post.
autostart
O método faz uso deste arquivo autostart .desktop
config que você deixaria cair neste diretório: $HOME/.config/autostart/watcher.sh.desktop
.
$ cat ~/.config/autostart/watcher.sh.desktop
[Desktop Entry]
Type=Application
Exec=/home/<username>/path/to/watcher/watcher.sh
Hidden=false
X-GNOME-Autostart-enabled=true
Name[de_DE]=watcher
Name=watcher
Comment[de_DE]=
Comment=
watch.sh
O script watch.sh
recebe argumentos, portanto, é necessário incluir os que estão na linha Exec=
acima. Veja um exemplo de como o watcher.sh
pode parecer:
$ cat watch.sh
#!/bin/bash
# param $1: type, in:
# ["SCREEN_LOCKED",
# "SCREEN_UNLOCKED",
# "LOGIN",
# "LOGOUT",
# "SIGINT",
# "SIGTERM"]
function write_log {
if [ -z $1 ]; then
1="unspecified"
fi
echo -e "$1\t$(date)" >> "$LOG"
}
function notify {
echo "$@" >&2
}
function show_usage {
notify "Usage: $0 login <address> <logfile>"
notify "Parameters:"
notify " login: You must use the string 'login' to avoid seeing this message."
notify " <logfile>: File to store logs."
notify ""
notify "This script is designed to go in the bashrc file, and be called in the"
notify "form of: $0 login '$USER@$(uname -n)' >>/path/to/logfile &"
notify ""
}
if [ "$#" -eq 0 ]; then
show_usage
exit 1
fi
if [ "$1" != "login" ]; then
show_usage
notify "Error: first parameter must be the string 'login'."
exit 1
fi
LOG="$2"
if [ -z "$LOG" ]; then
notify "Error: please specify a logfile."
exit 1
elif [ -f "$LOG" ]; then
# If the logfile exists, verify that the last action was a LOGOUT.
LASTACTION=$(tail -1 "$LOG" | awk '{print $1}')
if [ $LASTACTION != "LOGOUT" ]; then
notify "Logfile '$LOG' exists but last action was not logout: $LASTACTION"
exit 1
fi
else
# If the file does not exist, create it.
touch "$LOG" || ( notify "Cannot create logfile: '$2'" && exit 1 )
fi
# Begin by logging in:
write_log "LOGIN"
# Handle signals by logging:
trap "write_log 'LOGOUT'; exit" SIGHUP
trap "write_log 'INTERRUPTED_SIGINT'; exit 1" SIGINT
trap "write_log 'INTERRUPTED_SIGTERM'; exit 1" SIGTERM
# Monitor gnome for screen locking. Log these events.
dbus-monitor --session "type='signal',interface='org.gnome.ScreenSaver'" | \
(
while true; do
read X;
if echo $X | grep "boolean true" &> /dev/null; then
write_log "SCREEN_LOCKED"
elif echo $X | grep "boolean false" &> /dev/null; then
write_log "SCREEN_UNLOCKED"
fi
done
)
Com o script no lugar quando você faz o login, ele emitirá entradas para qualquer arquivo de log incluído na linha Exec=
que você especificar.
Exec="/path/to/watcher.sh login someuser.log >> error.log"
Exemplo
Você pode simular a execução via linha de comando diretamente:
$ ./watcher.bash login someuser.log >> smurf.log &
[1] 20684
Se você bloquear sua tela e desbloquear, verá mensagens como estas:
$ more someuser.log
LOGIN Fri Mar 7 20:16:29 EST 2014
SCREEN_LOCKED Fri Mar 7 20:25:48 EST 2014
SCREEN_UNLOCKED Fri Mar 7 20:28:02 EST 2014
SCREEN_UNLOCKED Fri Mar 7 20:28:03 EST 2014
INTERRUPTED_SIGINT Fri Mar 7 21:44:46 EST 2014
OBSERVAÇÃO: A mensagem "LOGIN" do script acima é de quando você chama o script. Eu abortei o script usando Ctrl + C , que gerou a mensagem "INTERRUPTED_SIGINT" por meio de um dos traps no script watch.sh
. Se eu tivesse feito o logout, teria mostrado uma mensagem que eu "LOGOUT".